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

dev*_*all 5 c# xml serialization

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

谢谢

Dar*_*rov 6

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

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

是什么让一个对象可以串行化

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

可序列化对象与xml有什么关系

对象可以序列化为XML.在.NET中,这可以通过XmlSerializer类实现,也可以使用DataContractSerializer实现.


Han*_*ant 6

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

Windows 窗体控件就是一个很好的例子。没有父控件,控件就无法存在,例如它所在的窗体。反序列化控件会留下一个没有父控件的控件,您必须序列化整个对象图才能使其有意义。然后,有些属性的运行时值在反序列化时不会重现。例如,句柄属性。Windows 不会重现相同的句柄。或者快捷键指示符是否带有下划线(按 Alt 键)。这很大程度上取决于程序的整个状态。因此,Control 不具有 [Serializable] 属性。


Ste*_*ers 5

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

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

可以这么说,您可以使用转换器序列化器)来转换可转换可序列化)的内容。类本身没有改变,但它确实向类添加了功能。

原因示例:

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

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


kd7*_*kd7 1

可序列化的对象可以“分解”,通过各种通道传输,并在接收通道的末尾“重建”,该接收通道可能是完全不同的位置,处于其“分解”的确切状态。您可能有在谈论序列化的过程中听说过 xml,因为 xml 为此提供了一种机制。

考虑以下对象:

Person p = new Person();
p.Age = 33;
p.Name = "Magni";
Run Code Online (Sandbox Code Playgroud)

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

<Person>
    <Name>Magni</Name>
    <Age>33</Age>
</Person>
Run Code Online (Sandbox Code Playgroud)

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

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