【问题标题】:Serializable objects vs. non-serializable objects可序列化对象与不可序列化对象
【发布时间】:2010-09-10 17:56:33
【问题描述】:

C#中可序列化对象和不可序列化对象有什么区别,是什么让对象可序列化?

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

【问题讨论】:

  • “可序列化对象与 xml 有什么关系” 序列化对象有许多不同的方法 XML 恰好是一种流行的方法。在 .Net 框架中,您还可以轻松地序列化为 Json 字符串或二进制。

标签: c# xml serialization


【解决方案1】:

可序列化对象与不可序列化对象有什么区别

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

以及是什么让对象可序列化

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      有了这个,可以这么说,你可以使用 converter (serializer) 来convert 一些 convertable em>(可序列化)。类本身并没有改变,但它确实为类添加了功能。

      原因举例:

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

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

      【讨论】:

        【解决方案4】:

        可序列化的对象可以“分解”,通过各种通道传输,并在接收通道末端“重建”,接收通道可能是完全处于“分解”状态的完全其他位置。你可能在讲序列化的过程中听说过xml,因为xml为此提供了一种机制。

        考虑以下对象:

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

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

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

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

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

        【讨论】:

        • 我其实有一个后续问题,用 [Serializable] 属性修饰的对象发生了什么变化?将其应用于课程是否有限制?为什么不这样做?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-08
        • 1970-01-01
        • 1970-01-01
        • 2014-02-10
        • 1970-01-01
        相关资源
        最近更新 更多