Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# binaryformatter如何序列化对象?_C#_Visual Studio_Binaryformatter - Fatal编程技术网

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==-相反,它显示了类似-ExecutionResponse
1[Response2]LogEntry2-其中ExecutionResponse
1[Response2]是in.Data(在这种特殊情况下,数据是包含ExecutionResponse类型的单个项,该项具有Response2对象列表(此处为列表中的单个Response2对象),LogEntry是当前的类名,而2是id。后者大体上是我所期望的-这看起来是在原始数据之前的类型元数据,然后是字段…我不相信这是错的(现在).但在第二种情况下,并不是序列化日志中存在的所有数据,对吗?我的意思是不可能从第二个日志中反序列化(即在ExecutionResponse`1[Response2]LogEntry2中)。即使Response2是可序列化的,也没有任何关于Response2的内容。因此,如果尝试对其进行反序列化,您会得到什么回报?序列化为二进制格式后,它应该看起来像-aaaaaad/////aqaaaaaaaaaaaaaaaagaaahlnawnyb3nvznq….aaaaaaaaaaa=-而不是-ExecutionResponse
1[Response2]LogEntry2-其中ExecutionResponse
1[Response2]位于.Data中(在这种特殊情况下,数据包含ExecutionResponse类型的单个项,该项具有Response2对象列表(此处为列表中的单个Response2对象),LogEntry是当前的类名,而2是id。后者大体上是我所期望的-这看起来是在原始数据之前的类型元数据,然后是字段…我不相信这是错的(现在).但在第二种情况下,并不是序列化日志中的所有数据,对吗?我的意思是,无法从第二个日志(即ExecutionResponse`1[Response2]LogEntry2)中反序列化。即使Response2是可序列化的,也不存在Response2的任何内容。因此,如果尝试反序列化它,您会得到什么?