可序列化对象与非可序列化对象

时间:2010-09-10 17:56:34

标签: c# programming-languages

Serializable对象与非可序列化对象的区别是什么,以及什么使对象可序列化?可序列化对象与xml有什么关系?

由于

4 个答案:

答案 0 :(得分:5)

  

Serializable对象与非可序列化对象的区别是什么

可序列化对象可以转换为其他表示形式(如文本),以便跨进程边界轻松传输,而非可序列化对象则不能。

  

是什么使对象可串行

在.NET中,根据您决定使用的序列化程序,该对象需要符合某些要求。例如,如果您使用BinaryFormatter,则需要使用[Serializable]属性修饰对象。

  

可序列化对象与xml

有什么关系

可以将对象序列化为XML。在.NET中,这可以通过XmlSerializer类以及DataContractSerializer来实现。

答案 1 :(得分:3)

问题几乎从不是您是否可以序列化对象。真正的问题通常是:当你反序列化时,你可以重建对象的可用和逐字副本。

一个很好的例子是Windows窗体控件。没有父级的控件不能存在,比如托管它的表单。对控件进行反序列化会使您在没有父控件的情况下使用控件,您必须序列化整个对象图以使其有意义。然后,有些属性具有在反序列化时不会重现的运行时值。例如Handle属性。 Windows不会重现相同的句柄。或者快捷键指示符是否加下划线(按Alt键)。这关键取决于整个计划的状态。因此,Control没有[Serializable]属性。

答案 2 :(得分:2)

这里的答案是正确的,但是从不同的角度攻击这个概念,并希望增加你的理解,我提出以下建议:

将'serializable'这个词想象成'可转换'。因此,当一个类被标记为可序列化时,它可以转换为您正在寻找的任何类型的表示。串行器(即BinaryFormatter或XmlSerializer)可以被认为是“转换器”。

有了这个,可以这么说,你可以使用转换器 serializer )来转换 convertable em>( serializable )。类本身不会改变,但它确实为类添加了功能。

原因举例:

  • 一种常见的用法是将对象转换为二进制表示形式(使用二进制格式化程序进行序列化),如果您希望将其轻松写入磁盘或通过套接字将其发送到另一个应用程序。
  • 另一种常见用法是将对象转换为xml表示形式(如RandomNoob的答案中所示),如果您想将其发送到Web服务。

序列化时需要考虑一些注意事项(例如,您通常不希望在.NET中序列化事件,并使用[field:non-serialized]属性标记它们),因此需要进行更多研究在这方面,但从概念上讲,试着将其视为转换对象进行存储或传输。

答案 3 :(得分:1)

可串行化的对象可以“分开”,通过各种信道传输,并在接收信道的末端“重建”,接收信道可以是处于“分开”状态的完全其他位置。您可能已经听过在讨论序列化过程中提到的xml,因为xml为此提供了一种机制。

考虑以下对象:

Person p = new Person();
p.Age = 33;
p.Name = "Magni";

如果您想将此对象保存在当前状态 - 您可以有效地将其表示为:

<Person>
    <Name>Magni</Name>
    <Age>33</Age>
</Person>

然后可以通过网络发送此XML,并且在不同平台的情况下,可以由另一个实体或服务重建或使用原始Person对象。

这是一个30000英尺的视图,序列化经常变得复杂,但我试图从最广泛的意义上回答你的问题。