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
值。我的问题是 - 有这种行为的具体原因还是我犯了一些错误?提前谢谢。
答案 0 :(得分:0)
你的问题不是很明确(你可以定义“不序列化”吗?),但有些想法:
你应该使用ToArray()
来捕获缓冲区,而不是GetBuffer()
( 更便宜,但返回超大数组,并且只能与{一起使用} {1}})。
你在哪里看到Length
? .ToString()
写入对象类型,然后使用反射来编写字段(用于BinaryFormatter
)或使用客户序列化(用于[Serializable]
)。它永远不会调用ISerializable
(除非这是.ToString()
所做的)。但是,字符串等 将“按原样”输出到输出中。
请注意,ISerializable
版本之间可能会很脆弱,因此如果要将这些数据保留一段时间,请务必小心(但对于传输来说,这通常很好,假设您同时更新两端) 。如果您事先知道BinaryFormatter
对象是什么,那么有一系列基于合同的序列化程序可能会提供更高的稳定性。如果您认为值得研究,我可以提供更具体的帮助。