Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.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# 序列化中传递的是什么数据?(二进制序列化)_C#_Serialization - Fatal编程技术网

C# 序列化中传递的是什么数据?(二进制序列化)

C# 序列化中传递的是什么数据?(二进制序列化),c#,serialization,C#,Serialization,在序列化(二进制序列化)中,传输的是什么数据?类(对象)的实例或指定给该对象属性的值 我想知道序列化过程中基本上发生了什么?我的意思是一个对象被转换成它的目标文件或任何序列化的文件。但是怎么做呢?在此过程中遵循哪些步骤 有人能帮忙吗 Jay…默认情况下,使用二进制序列化时,仅序列化类型的字段。属性被视为方法,对序列化没有影响 使用Xml序列化时,默认情况下会序列化公共属性。我假定您指的是BinaryFormatter;视情况而定-p 序列化的目的是将复杂的内存对象表示为简单的字节序列(或取决于序

在序列化(二进制序列化)中,传输的是什么数据?类(对象)的实例或指定给该对象属性的值

我想知道序列化过程中基本上发生了什么?我的意思是一个对象被转换成它的目标文件或任何序列化的文件。但是怎么做呢?在此过程中遵循哪些步骤

有人能帮忙吗


Jay…

默认情况下,使用二进制序列化时,仅序列化类型的字段。属性被视为方法,对序列化没有影响


使用Xml序列化时,默认情况下会序列化公共属性。

我假定您指的是
BinaryFormatter
;视情况而定-p

序列化的目的是将复杂的内存对象表示为简单的字节序列(或取决于序列化程序-字符等),可以在另一端重新水合以重新创建对象

某些类型(原语、字符串等)具有序列化程序内置的直接支持—它直接写入这些类型

对于类,写入类型元数据(包括程序集名称等),然后枚举类型上的所有字段(基本上是
type.GetFields()
,包括private等)。对于每个字段(未标记为
[NonSerialized]
),将写入字段名,并序列化值(通过相同的过程)。最终,一切都归结为内置原语、一些类型定义和一些名称/值字段对

这里的一个例外是,如果类型实现了
ISerializable
,则要求该类型将自身序列化到输出。这在字典类型中很常见,在字典类型中,类型的内存布局可以用不同的方式表示为流

在反序列化过程中,该过程是反向的;类型元数据用于创建空对象(除非它具有特殊的序列化构造函数/
ISerializable
);然后在流中找到字段时设置字段

在序列化和反序列化中都有“回调”点,您可以在其中执行附加代码来修复(反)序列化的对象

这个过程是脆弱的;出于很多原因,-但它也是版本不可容忍和特定于实现的(您不能从java等使用它)

通过成为基于契约而不是基于字段的二进制序列化程序,解决了许多这些问题


二进制序列化是对对象进行快照并将其序列化。这意味着所有未标记为不可序列化的私有字段都将使用其值进行序列化。 对象层次结构中使用的所有对象都必须设置为可序列化。 您应该在事件上添加[field:NonSerializable]属性,这样事件处理程序就不会被序列化:


请记住,当反序列化对象时,必须在相同的程序集中拥有与序列化对象时完全相同的对象(相同的意思是相同的程序集信息)。如果没有,您可以使用SerializationBinder类,以便可以重置要消毒的流的类型。

是字段本身还是分配给该字段的值?是字段还是分配给该字段的值,还是两者都有?对于xml序列化,公共字段+具有读写访问器的属性;未标记为[XmlIgnore]的;或
IXmlSerializable
具有第一个DIB-派斯!这个[field:NonSerializable]属性非常值得了解。当您不在事件上使用该属性时,该代码只会给您一个虚假的序列化异常,让您完全不知道抛出异常的原因。Pedant:[字段:非序列化]仅适用于“类似字段的事件”;对于其他事件实现(显式字段、EventHandlerList等),您可以直接标记该字段。自动属性如何,它们的支持字段是否序列化?哦,既然你提到了protobuf网络,这里的链接是:重新自动属性:是的,它们是;但这一点尤其脆弱,请参见“查看此处”链接了解原因。我会编辑把protobuf网络链接放进去,但有趣的是,我已经非常了解它了-汉克斯。顺便说一句:我知道你知道这个链接,我为其他读者添加了它:)