通用类约束 - 我可以指定Generic类型可以序列化为XML吗?

时间:2011-10-19 20:10:11

标签: c# xml-serialization

我正在编写一个Generic类,它尝试将Type T的对象序列化为XML。不幸的是(我确定你知道)并非所有对象都可以成功地序列化为XML,因此我希望能够编写一个约束来指定T只能是一个XML Serializable类。这有可能吗?

非常肯定这个问题的答案是“不”,但想想无论如何我都会问,以防我错过了什么。

2 个答案:

答案 0 :(得分:5)

唯一可用的限制是:

  • class / struct
  • new()
  • BaseType / Interface

其中,只有2个略微有趣的是:new()(因为XmlSerializer需要公共无参数构造函数)和:Interface(因为{{1} }}是其中一个选项);但是:

  • IXmlSerializable不是必需,因此不适用
  • 此处没有约束强制类型为 public 类型(对于嵌套类型,公共类型的公共类型)
  • 它没有考虑到泛型限制

所以简而言之:不,这不是你可以通过通用约束强制执行的东西

答案 1 :(得分:4)

你是对的,答案是否定的,你不能将泛型类型限制为XML可序列化。

原因在于,XML Serializer有一些关于它将序列化的非常具体的规则(最值得注意的是,它仅序列化公共属性,并且只有具有公共无参数构造函数的类型)。使XML类可序列化的因素无法用类型表示,因此无法为其制定通用约束。

您可以约束到接口,因此可能的解决方案是在XML可序列化的类型上使用标记接口。然后,如果您不控制要序列化的类型,则不起作用。