XmlSerializer.Serialize含糊不清

Ano*_*ous 5 .net c# xml xml-serialization

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

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

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

XmlSerializer xmlSerializer = new XmlSerializer(typeof(SportCar));
Run Code Online (Sandbox Code Playgroud)

XmlSerializer xmlSerializer = new XmlSerializer(
    typeof(SportCar), 
    new Type[] { typeof(Car), typeof(Radio) }); 
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ell 8

最大的区别是,当你需要告诉XmlSerializer有关类-例如:

XmlSerializer xmlSerializer = new XmlSerializer(typeof(Car),
     new Type[] { typeof(SportCar), typeof(Radio) });
Run Code Online (Sandbox Code Playgroud)

在这里,没有额外的信息,如果不知道(只是Car)关于任何一个SportCarRadio- 所以如果你给它一个实际上是一个对象SportCar,它将失败:

Car car = new SportCar {...};
xmlSerializer.Serialize(destination, car);
Run Code Online (Sandbox Code Playgroud)

您也可以通过设置做到这一点[XmlInclude(typeof(SportCar))]Car类型定义:

[XmlInclude(typeof(SportCar))]
public class Car {...}
Run Code Online (Sandbox Code Playgroud)

这更容易,但只有在Car类型位于已知的程序集中时才可能SportCar.但是,你经常知道这一点,所以XmlInclude是较好的选择.

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