2

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()所有个体的值Data、类名 ( ...LogEntry) 和id值。我的问题是——这种行为有具体原因还是我做错了什么?提前致谢。

4

1 回答 1

0

你的问题不是很清楚(你能定义“不序列化”吗?),但有一些想法:

您应该真正使用ToArray()来捕获缓冲区,而不是GetBuffer()(这便宜,但返回过大的数组,并且只能与 结合使用Length)。

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

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

于 2009-12-08T06:23:34.007 回答