C# 객체 이진 직렬화
-
20-09-2019 - |
문제
객체의 이진 직렬화와 결과를 데이터베이스에 저장하고 싶습니다.
Person person = new Person();
person.Name = "something";
MemoryStream memorystream = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(memorystream, person);
데이터베이스에 저장할 문자열 유형에서 MemoryStream을 어떻게 변환하고, 그 후에 객체를 사로화 할 수 있습니까?
해결책
당신은 무엇입니까? 진짜 요청하는 것은 임의의 이진 데이터를 텍스트로 표현한 다음 다시 변환하는 안전한 방법입니다. 직렬화 된 객체를 저장한다는 사실은 관련이 없습니다.
대답은 거의 기본 64를 사용하는 것입니다 (예 : Convert.ToBase64String
그리고 Convert.FromBase64String
). 하다 ~ 아니다 사용 Encoding.UTF8.GetString
또는 유사한 것 - 이진 데이터입니다 ~ 아니다 인코딩 된 텍스트 데이터를 처리해서는 안됩니다.
그러나 데이터베이스에 이진 데이터에 대한 데이터 유형이 없습니까? 얼룩, 이미지 및 이진 유형을 확인하십시오 ...
다른 팁
다음은 샘플입니다. TDATA는 [SERIALIZABLE]으로 표시하고 모든 필드 유형도 표시해야합니다.
private static TData DeserializeFromString<TData>(string settings)
{
byte[] b = Convert.FromBase64String(settings);
using (var stream = new MemoryStream(b))
{
var formatter = new BinaryFormatter();
stream.Seek(0, SeekOrigin.Begin);
return (TData)formatter.Deserialize(stream);
}
}
private static string SerializeToString<TData>(TData settings)
{
using (var stream = new MemoryStream())
{
var formatter = new BinaryFormatter();
formatter.Serialize(stream, settings);
stream.Flush();
stream.Position = 0;
return Convert.ToBase64String(stream.ToArray());
}
}
//-------write to database-------------------------
Person person = new Person();
person.name = "Firstnm Lastnm";
MemoryStream memorystream = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(memorystream, person);
byte[] yourBytesToDb = memorystream.ToArray();
//here you write yourBytesToDb to database
//----------read from database---------------------
//here you read from database binary data into yourBytesFromDb
MemoryStream memorystreamd = new MemoryStream(yourBytesFromDb);
BinaryFormatter bfd = new BinaryFormatter();
Person deserializedperson = bfd.Deserialize(memorystreamd) as Person;
나는 이런 것을 사용했다
MemoryStream memoryStream = new MemoryStream();
BinaryFormatter binaryFormatter = new BinaryFormatter();
binaryFormatter.Serialize(memoryStream, Person);
memoryStream.Flush();
memoryStream.Position = 0;
string value = Convert.ToBase64String(memoryStream.ToArray());
원래, ~하지 않다 데이터를 데이터베이스에 문자열로 저장하면 blob
이진 데이터를 저장하는 데 사용할 수있는 필드.
실제로 데이터를 문자열로 가져야하는 경우 Byte []를 Base64 인코딩을 사용하여 바이트 []를 문자열로 변환하고 문자열 사용 디코딩에서 바이트 []를 잡아야합니다.
메모리 스트림을 데이터베이스에 넣을 Base64hex 문자열로 변환하지 않았습니까?
byte[] mStream = memorystream.ToArray();
string sConvertdHex = System.Convert.ToBase64String(mStream)
그런 다음 내용 SconvertDHex를 데이터베이스에 버릴 수 있습니다. 그것을 버리기 위해서는 반대를해야합니다
byte[] mData = System.Convert.FromBase64String(...)
그런 다음 MDATA를 객체로 다시 데려옵니다.