C# binaryformatter如何序列化对象?
C# binaryformatter如何序列化对象?,c#,visual-studio,binaryformatter,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
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();
}
}
[可序列化]
公共类日志条目
{
私有int-id;
私有列表数据=新列表();
公共整数Id
{
获取{return id;}
}
公共IList数据
{
获取{return data.AsReadOnly();}
}
...
}
....
....
私有静态只读BinaryFormatter logSerializer=new BinaryFormatter();
....
....
公共日志(IList日志条目)
{
使用(MemoryStream serializationStream=new MemoryStream())
{
Serialize(serializationStream,logEntries);
this.binarySerializedLog=serializationStream.GetBuffer();
}
}
在某些机器(32位或64位机器)中,它是以二进制格式序列化的-这是预期的。但在某些机器中(所有这些机器都是64位机器,不用于调试构建),它不是序列化的,
binarySerializedLog
显示所有单个数据的ToString()
值、类名(…LogEntry
)和id
值。我的问题是——这种行为有没有具体的原因,或者我犯了什么错误?提前谢谢。你的问题不是很清楚(你能定义“不序列化”吗?),但有一些想法:
您应该真正使用ToArray()
来捕获缓冲区,而不是GetBuffer()
(这更便宜,但返回的是超大数组,并且只能与长度
一起使用)
您在哪里看到这个.ToString()
BinaryFormatter
写入对象类型,然后使用反射写入字段(对于[Serializable]
),或者使用客户序列化(对于ISerializable
)。它从不调用.ToString()
(除非这是您的ISerializable
所做的)。但是,字符串等将按“原样”显示在输出中
请注意,BinaryFormatter
在不同版本之间可能很脆弱,因此,如果要将此数据保留任意长度的时间,请务必小心(不过,假设您同时更新两端,这对于传输来说通常是好的)。如果您事先知道.Data
对象是什么,那么有一系列基于契约的序列化程序可以提供更高的稳定性。如果您认为这值得调查,我可以提供更具体的帮助。您的问题不是很清楚(您能否定义“不序列化”?),但有一些想法:
您应该真正使用ToArray()
来捕获缓冲区,而不是GetBuffer()
(这更便宜,但返回的是超大数组,并且只能与长度
一起使用)
您在哪里看到这个.ToString()
BinaryFormatter
写入对象类型,然后使用反射写入字段(对于[Serializable]
),或者使用客户序列化(对于ISerializable
)。它从不调用.ToString()
(除非这是您的ISerializable
所做的)。但是,字符串等将按“原样”显示在输出中
请注意,BinaryFormatter
在不同版本之间可能很脆弱,因此,如果要将此数据保留任意长度的时间,请务必小心(不过,假设您同时更新两端,这对于传输来说通常是好的)。如果您事先知道.Data
对象是什么,那么有一系列基于契约的序列化程序可以提供更高的稳定性。如果您认为这值得研究,我可以提供更具体的帮助。在序列化为二进制格式后,它应该看起来像-aaaaad/////aqaaaaaaaaaagaaaahalnawnyb3nvznq….aaaaaaaaaa==-相反,它显示了类似-ExecutionResponse1[Response2]LogEntry2-其中ExecutionResponse
1[Response2]是in.Data(在这种特殊情况下,数据是包含ExecutionResponse类型的单个项,该项具有Response2对象列表(此处为列表中的单个Response2对象),LogEntry是当前的类名,而2是id。后者大体上是我所期望的-这看起来是在原始数据之前的类型元数据,然后是字段…我不相信这是错的(现在).但在第二种情况下,并不是序列化日志中存在的所有数据,对吗?我的意思是不可能从第二个日志中反序列化(即在ExecutionResponse`1[Response2]LogEntry2中)。即使Response2是可序列化的,也没有任何关于Response2的内容。因此,如果尝试对其进行反序列化,您会得到什么回报?序列化为二进制格式后,它应该看起来像-aaaaaad/////aqaaaaaaaaaaaaaaaagaaahlnawnyb3nvznq….aaaaaaaaaaa=-而不是-ExecutionResponse1[Response2]LogEntry2-其中ExecutionResponse
1[Response2]位于.Data中(在这种特殊情况下,数据包含ExecutionResponse类型的单个项,该项具有Response2对象列表(此处为列表中的单个Response2对象),LogEntry是当前的类名,而2是id。后者大体上是我所期望的-这看起来是在原始数据之前的类型元数据,然后是字段…我不相信这是错的(现在).但在第二种情况下,并不是序列化日志中的所有数据,对吗?我的意思是,无法从第二个日志(即ExecutionResponse`1[Response2]LogEntry2)中反序列化。即使Response2是可序列化的,也不存在Response2的任何内容。因此,如果尝试反序列化它,您会得到什么?