C#对象二进制序列化

Ema*_*uel 32 c# string serialization binaryformatter

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

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

MemoryStream memorystream = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(memorystream, person);
Run Code Online (Sandbox Code Playgroud)

如何将字符串类型中的memorystream转换为保存在数据库中,之后能够反序列化对象?

Jon*_*eet 53

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

答案几乎是使用Base 64(例如Convert.ToBase64StringConvert.FromBase64String).千万不能使用Encoding.UTF8.GetString或任何类似-您的二进制数据编码的文本数据,并且不应该被如此对待.

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

  • @ loneshark99:因为`Encoding`是针对本质上是文本的数据而设计的 - 它将该文本转换为二进制数据,而base64和hex则设计用于将固有的二进制任意数据表示为文本而不会丢失信息. (3认同)
  • @loneshark99:我根本不明白你的评论。如果这是任意二进制数据 - 而不是编码文本 - 那么使用“编码”将恰恰是*错误的*方法。 (2认同)

Sia*_*huk 40

这是样本.必须将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());
        }
    }
Run Code Online (Sandbox Code Playgroud)


小智 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;
Run Code Online (Sandbox Code Playgroud)

  • `MemoryStream` 周围应该有一个 `using` (2认同)

Adr*_*der 12

我用过这样的东西

MemoryStream memoryStream = new MemoryStream();
BinaryFormatter binaryFormatter = new BinaryFormatter();
binaryFormatter.Serialize(memoryStream, Person);
memoryStream.Flush();
memoryStream.Position = 0;
string value = Convert.ToBase64String(memoryStream.ToArray());
Run Code Online (Sandbox Code Playgroud)

  • 在调用ToArray之前,您不需要回滚MemoryStream - 它返回整个流的数据,而不管当前位置如何.同样Flush在MemoryStream上没有做任何事情,尽管对于一般的流来说它是一个好主意. (10认同)