gpt4 book ai didi

c# - XmlSerializer.Serialize 不明确

转载 作者:数据小太阳 更新时间:2023-10-29 01:55:12 27 4
gpt4 key购买 nike

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

  • 汽车
  • 广播
  • SportCar:汽车(有 radio )

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

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

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

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

最佳答案

最大的区别是当您需要告诉 XmlSerializer 关于 类时 - 例如:

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

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

Car car = new SportCar {...};
xmlSerializer.Serialize(destination, car);

您还可以通过针对 Car 类型定义设置 [XmlInclude(typeof(SportCar))] 来完成此操作:

[XmlInclude(typeof(SportCar))]
public class Car {...}

这更容易,但只有当 Car 类型位于了解 SportCar 的程序集中时才有可能。但是您通常确实知道这一点,因此 XmlInclude 是首选。

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

关于c# - XmlSerializer.Serialize 不明确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1016721/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com