问题中的陈述是否正确?
例如,似乎无法使用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是唯一的方法)?
答案 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);