BinaryFormatter处理的案例多于XmlSerializer?

时间:2016-06-15 22:54:29

标签: c# serialization

问题中的陈述是否正确?

例如,似乎无法使用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是唯一的方法)?

2 个答案:

答案 0 :(得分:1)

我不知道存在结构限制 - 其中一种类型无法用序列化技术表示。但是,有些情况下xml序列化更容易而不是二进制序列化...因此:二进制序列化带有类型信息而xml序列化则没有。在这方面,Xml序列化更接近于所谓的鸭子打字。是的,元素名称和命名空间提供了提示,但没有提出要求。

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

当然,您可以使用大多数序列化技术实现代理和各种映射技术。 Xml序列化只是针对这些场景而设计的......特别是数据协定序列化对于这些情况来说是疯狂的。

答案 1 :(得分:0)

不,这不对。取决于许多情况。在某些情况下,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);