我想对对象进行二进制序列化,并将结果保存到数据库中。
Person person = new Person();
person.Name = "something";
MemoryStream memorystream = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(memorystream, person);
如何将字符串类型中的memorystream转换为保存在数据库中,之后能够反序列化该对象?
答案 0 :(得分:52)
您真正要求的是一种将任意二进制数据表示为文本然后再将其转换回来的安全方式。它存储序列化对象这一事实无关紧要。
答案几乎是使用Base 64(例如Convert.ToBase64String
和Convert.FromBase64String
)。 不使用Encoding.UTF8.GetString
或类似的东西 - 您的二进制数据是不是编码的文本数据,不应该这样对待。
但是,您的数据库是否没有二进制数据的数据类型?检查BLOB,IMAGE和BINARY类型......
答案 1 :(得分:35)
这是样本。必须将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());
}
}
答案 2 :(得分:15)
//-------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;
答案 3 :(得分:12)
我使用过这样的东西
MemoryStream memoryStream = new MemoryStream();
BinaryFormatter binaryFormatter = new BinaryFormatter();
binaryFormatter.Serialize(memoryStream, Person);
memoryStream.Flush();
memoryStream.Position = 0;
string value = Convert.ToBase64String(memoryStream.ToArray());
答案 4 :(得分:2)
基本上,不将数据作为字符串保存到数据库中,有blob
个字段可用于存储二进制数据。
如果你真的需要将数据作为字符串,你需要使用base64编码将byte []转换为字符串,并使用解码从字符串中获取byte []。
答案 5 :(得分:0)
您是否考虑过将内存流转换为要放入数据库的base64hex字符串?
byte[] mStream = memorystream.ToArray();
string sConvertdHex = System.Convert.ToBase64String(mStream)
然后您可以将内容sConvertdHex转储到数据库中。要反序列化它,您需要执行相反的操作
byte[] mData = System.Convert.FromBase64String(...)
然后将mData反序列化回您的对象。