【问题标题】:XmlSerializer.Serialize ambiguousXmlSerializer.Serialize 不明确
【发布时间】:2009-06-19 07:14:09
【问题描述】:

我创建了包含 3 个类的测试应用程序

  • 汽车
  • 收音机
  • SportCar:汽车(有收音机)

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

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

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

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

【问题讨论】:

    标签: c# .net xml xml-serialization


    【解决方案1】:

    最大的区别是当你需要告诉XmlSerializer关于sub类的时候——例如:

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

    在这里,如果没有额外的信息,如果不知道(仅来自 Car)关于 SportCarRadio - 所以如果你给它一个实际上是 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))) 执行此操作 - 即无论您使用此构造函数多少次,它只会生成一次动态代码。如果您使用更复杂的构造函数 (new XmlSerializer(typeof(Car),new Type[] { typeof(SportCar), typeof(Radio) })),它将每次都生成类型。

    【讨论】:

    • 如果我指定子类信息,输出有什么区别? (我是序列化过程的新手)
    • 使用XmlInclude方式和构造函数(new Type[])方式在输出上没有区别;它们是等价的。如果你都不做,并要求一个 XmlSerializer(typeof(Car)),但给它一个 SportCar - 它会抛出一个异常。
    • 我明白了,在简单地阅读了关于 C# 3.0 上的 XmlSerializer 的主题后,又阅读了您提到“关于子类”的答案,这让我了解了 XmlSerializer 的工作原理。 (我买了另一本书来学习 C#,太糟糕了。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    • 2012-08-26
    相关资源
    最近更新 更多