C#对象二进制序列化
我想对对象进行二进制序列化,并将结果保存到数据库中。
Person person = new Person(); person.Name = "something"; MemoryStream memorystream = new MemoryStream(); BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(memorystream, person);
如何将字符串类型中的memorystream转换为要保存在数据库中,之后能够反序列化对象?
您真正要求的是一种将任意二进制数据表示为文本然后再将其转换回来的安全方法。 它存储序列化对象的事实是无关紧要的。
答案几乎是使用Base 64(例如Convert.ToBase64String
和Convert.FromBase64String
)。 不要使用Encoding.UTF8.GetString
或类似的东西 – 您的二进制数据不是编码的文本数据,不应该这样对待。
但是,您的数据库没有二进制数据的数据类型吗? 检查BLOB,IMAGE和BINARY类型……
这是样本。 必须将TData标记为[Serializable]并且所有字段都必须输入。
private static TData DeserializeFromString(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 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
字段可用于存储二进制数据。
如果您确实需要将数据作为字符串,则需要使用base64编码将byte []转换为字符串,并使用解码从字符串中获取byte []。
你有没有考虑将内存流转换为base64hex字符串放入数据库?
byte[] mStream = memorystream.ToArray(); string sConvertdHex = System.Convert.ToBase64String(mStream)
然后,您可以将内容sConvertdHex转储到数据库。 要反序列化它,你需要反过来
byte[] mData = System.Convert.FromBase64String(...)
然后将mData反序列化回您的对象。