binaryformatter如何序列化对象?

时间:2009-12-08 04:48:38

标签: c# visual-studio binaryformatter

BinaryFormatter在我的代码中以奇怪的方式表现。我有如下代码

[Serializable]
public class LogEntry
{        
    private int id;

    private List<object> data = new List<object>();

    public int Id
    {
        get { return id; }
    }

    public IList<object> Data
    {
        get { return data.AsReadOnly(); }
    }
    ...
}
....
....
private static readonly BinaryFormatter logSerializer = new BinaryFormatter();
....
....
public void SerializeLog(IList<LogEntry> logEntries)
{
        using (MemoryStream serializationStream = new MemoryStream())
        {
            logSerializer.Serialize(serializationStream, logEntries);
            this.binarySerializedLog = serializationStream.GetBuffer();
        }
}

在某些机器(32或64位机器)中,它以二进制格式进行序列化 - 这是预期的。但是在某些机器中(它们都是64位机器而不是调试版本)它没有序列化,binarySerializedLog显示所有单个ToString()的{​​{1}}值,类名({{ 1}})和Data值。我的问题是 - 有这种行为的具体原因还是我犯了一些错误?提前谢谢。

1 个答案:

答案 0 :(得分:0)

你的问题不是很明确(你可以定义“不序列化”吗?),但有些想法:

你应该使用ToArray()来捕获缓冲区,而不是GetBuffer() 更便宜,但返回超大数组,并且只能与{一起使用} {1}})。

你在哪里看到Length.ToString()写入对象类型,然后使用反射来编写字段(用于BinaryFormatter)或使用客户序列化(用于[Serializable])。它永远不会调用ISerializable(除非这是.ToString()所做的)。但是,字符串等 将“按原样”输出到输出中。

请注意,ISerializable版本之间可能会很脆弱,因此如果要将这些数据保留一段时间,请务必小心(但对于传输来说,这通常很好,假设您同时更新两端) 。如果您事先知道BinaryFormatter对象是什么,那么有一系列基于合同的序列化程序可能会提供更高的稳定性。如果您认为值得研究,我可以提供更具体的帮助。