【问题标题】:BinaryFormatter handles more cases than XmlSerializer?BinaryFormatter 比 XmlSerializer 处理更多的情况?
【发布时间】:2016-06-15 22:54:28
【问题描述】:

问题中的陈述是否正确?

例如,似乎没有办法用 XmlSerializer 序列化下面的代码(混合类型的数组),而 BinaryFormatter 工作得很好:

using System.IO;

[Serializiable]
class ParentCls
{
    int k;
}

[Serializiable]
class X : ParentCls
{
    string name = "foobar";
}

[Serializiable]
class Y : ParentCls
{
    double price = 32.0;
}

class Program
{
    static void Main(string[] args)
    {
        ParentCls[] data = new ParentCls[] { new X(), new Y() };
        using (Stream stream = File.Open("tmp.bin", FileMode.Create))
        {
            var binaryFormatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
            binaryFormatter.Serialize(stream, data);
        }
    }
}

在某些情况下 XmlSerialiser 可以做 BinaryFormatter 不能做的事情 (即在哪里使用 XmlSerialiser 是唯一的方法)?

【问题讨论】:

    标签: c# serialization


    【解决方案1】:

    我不知道存在结构上的限制 - 一种类型不能用任何一种序列化技术来表示。但是,在某些情况下,xml 序列化比二进制序列化更容易...原因是:二进制序列化携带类型信息,而 xml 序列化不携带。 xml 序列化在这方面更接近于所谓的duck typing。是的,元素名称和命名空间提供提示,但不提供要求。

    为什么这很重要?最常用的情况是序列化合约在客户端匹配一种类型,而在服务器上匹配另一种完全不同的类型......共享序列化格式(相同的类型名称和成员)的类型。这在数据协定序列化程序(一个 xml 序列化程序)和 WCF 中并不少见。值得注意的是,在您必须支持数据合约的多个版本的数据合约的情况下,xml 序列化提供了更简单的解决方案。这是对数据合约serialization strategies 的一些很好的概述。

    当然,您可以使用大多数序列化技术来实现代理和各种映射技术。 Xml 序列化只是专门为这些场景而构建的……特别是,数据合约序列化非常适合这些场景。

    【讨论】:

      【解决方案2】:

      不,这是不正确的。取决于很多情况。在某些情况下,BinaryFormatter 更方便,在其他情况下,XmlSerializer


      XmlSerializer 可以序列化一个混合类型的数组。为此,您需要按以下方式使用XmlInclude 属性。

      [XmlInclude(typeof(X))]
      [XmlInclude(typeof(Y))]
      public class ParentCls
      {
          public int k;
      }
      
      public class X : ParentCls
      {
          public string name = "foobar";
      }
      
      public class Y : ParentCls
      {
          public double price = 32.0;
      }
      

      请注意,您必须使用公共访问修饰符,这是XmlSerializer 的严重限制。

      示例用法

      ParentCls[] data = new ParentCls[] { new X(), new Y() };
      var xs = new XmlSerializer(typeof(ParentCls[]));
      
      using (Stream stream = File.Open("tmp.xml", FileMode.Create))
          xs.Serialize(stream, data);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-16
        • 2021-12-28
        • 1970-01-01
        • 2010-11-12
        • 2021-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多