33

我想对对象进行二进制序列化,并将结果保存在数据库中。

Person person = new Person();
person.Name = "something";

MemoryStream memorystream = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(memorystream, person);

如何将内存流转换为字符串类型以保存在数据库中,然后才能反序列化对象?

4

6 回答 6

56

真正需要的是一种将任意二进制数据表示为文本然后再次将其转换回来的安全方法。它存储序列化对象的事实是无关紧要的。

答案几乎是使用 Base 64(例如Convert.ToBase64Stringand Convert.FromBase64String)。不要使用或类似的东西——你的二进制数据不是编码的文本数据,应该被这样对待。Encoding.UTF8.GetString

但是,您的数据库是否没有二进制数据的数据类型?检查 BLOB、IMAGE 和 BINARY 类型...

于 2009-11-17T13:57:20.393 回答
44

这是示例。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());
        }
    }
于 2011-05-30T18:16:54.253 回答
19
//-------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;
于 2012-01-04T17:55:01.467 回答
14

我用过这样的东西

MemoryStream memoryStream = new MemoryStream();
BinaryFormatter binaryFormatter = new BinaryFormatter();
binaryFormatter.Serialize(memoryStream, Person);
memoryStream.Flush();
memoryStream.Position = 0;
string value = Convert.ToBase64String(memoryStream.ToArray());
于 2009-11-17T13:57:41.510 回答
2

基本上,不要将数据作为字符串保存到数据库中,有一些blob字段可用于存储二进制数据。

如果您确实需要将数据作为字符串,则需要使用 base64 编码将 byte[] 转换为字符串,并从字符串中获取 byte[] 使用解码。

于 2009-11-17T13:57:53.960 回答
0

您是否没有考虑将内存流转换为 base64hex 字符串以放入数据库?

 byte[] mStream = memorystream.ToArray();
 string sConvertdHex = System.Convert.ToBase64String(mStream)

然后您可以将内容 sConvertdHex 转储到数据库中。要反序列化它,您需要执行相反的操作

 byte[] mData = System.Convert.FromBase64String(...)

然后将 mData 反序列化回您的对象。

于 2009-11-17T13:58:41.307 回答