我创建了具有3个类的测试应用程序
当我创建XmlSerializer对象的实例时,作为序列化过程,我使用2个对象来测试
XmlSerializer xmlSerializer = new XmlSerializer(typeof(SportCar));
和
XmlSerializer xmlSerializer = new XmlSerializer(
typeof(SportCar),
new Type[] { typeof(Car), typeof(Radio) });
这两种方法的结果是相同的,所以我想知道需要使用#2构造函数的这两个构造函数或关键点之间有什么区别?
答案 0 :(得分:8)
最大的区别在于,当您需要告诉XmlSerializer
sub 类时 - 例如:
XmlSerializer xmlSerializer = new XmlSerializer(typeof(Car),
new Type[] { typeof(SportCar), typeof(Radio) });
在这里,没有额外的信息,如果不知道(仅来自Car
)关于SportCar
或Radio
- 所以如果你给它一个实际上是{的对象{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))
),它每次都会生成类型。