首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XmlSerializer.Serialize歧义

XmlSerializer.Serialize歧义
EN

Stack Overflow用户
提问于 2009-06-19 07:14:09
回答 1查看 735关注 0票数 5

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

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

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

代码语言:javascript
复制
XmlSerializer xmlSerializer = new XmlSerializer(typeof(SportCar));

代码语言:javascript
复制
XmlSerializer xmlSerializer = new XmlSerializer(
    typeof(SportCar), 
    new Type[] { typeof(Car), typeof(Radio) }); 

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-06-19 07:23:38

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

代码语言:javascript
复制
XmlSerializer xmlSerializer = new XmlSerializer(typeof(Car),
     new Type[] { typeof(SportCar), typeof(Radio) });

在这里,如果没有额外的信息,如果不知道(仅仅从Car)知道SportCarRadio,那么如果给它一个实际上是SportCar的对象,它就会失败:

代码语言:javascript
复制
Car car = new SportCar {...};
xmlSerializer.Serialize(destination, car);

还可以根据[XmlInclude(typeof(SportCar))]类型定义设置Car

代码语言:javascript
复制
[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) })),则每次都会进行类型生成。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1016721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档