XmlSerializer.Serialize含糊不清

时间:2009-06-19 07:14:10

标签: c# .net xml xml-serialization

我创建了具有3个类的测试应用程序

  • 汽车
  • 无线电
  • SportCar:Car(收音机)

当我创建XmlSerializer对象的实例时,作为序列化过程,我使用2个对象来测试

XmlSerializer xmlSerializer = new XmlSerializer(typeof(SportCar));

XmlSerializer xmlSerializer = new XmlSerializer(
    typeof(SportCar), 
    new Type[] { typeof(Car), typeof(Radio) }); 

这两种方法的结果是相同的,所以我想知道需要使用#2构造函数的这两个构造函数或关键点之间有什么区别?

1 个答案:

答案 0 :(得分:8)

最大的区别在于,当您需要告诉XmlSerializer sub 类时 - 例如:

XmlSerializer xmlSerializer = new XmlSerializer(typeof(Car),
     new Type[] { typeof(SportCar), typeof(Radio) });

在这里,没有额外的信息,如果不知道(仅来自Car)关于SportCarRadio - 所以如果你给它一个实际上是{的对象{1}},它会失败:

SportCar

您也可以通过针对Car car = new SportCar {...}; xmlSerializer.Serialize(destination, car); 类型定义设置[XmlInclude(typeof(SportCar))]来执行此操作:

Car

这更容易,但只有[XmlInclude(typeof(SportCar))] public class Car {...} 类型位于了解Car的程序集中才有可能。但是你经常知道这一点,所以SportCar是首选。

此外:XmlInclude有一些效率优势;在幕后,系统使用动态类型生成使XmlInclude有效。因此,您通常应该保留(并重新使用)您创建的XmlSerializer实例;例如,通过将其存储在静态字段中。但是,系统会自动为默认用法(XmlSerializer)执行此操作 - 即无论您使用此构造函数多少次,它只生成一次动态代码。如果使用更复杂的构造函数(new XmlSerializer(typeof(Car))),它每次都会生成类型。

相关问题