【发布时间】:2011-12-11 06:24:54
【问题描述】:
我正在编写一个尝试将类型 T 的对象序列化为 XML 的通用类。不幸的是(我相信您知道)并非所有对象都可以成功地序列化为 XML,因此我希望能够编写一个约束,指定 T 只能是 XML 可序列化的类。这有可能吗?
很确定这个问题的答案是“不”,但我想我还是会问,以防我遗漏了什么。
【问题讨论】:
标签: c# xml-serialization
我正在编写一个尝试将类型 T 的对象序列化为 XML 的通用类。不幸的是(我相信您知道)并非所有对象都可以成功地序列化为 XML,因此我希望能够编写一个约束,指定 T 只能是 XML 可序列化的类。这有可能吗?
很确定这个问题的答案是“不”,但我想我还是会问,以防我遗漏了什么。
【问题讨论】:
标签: c# xml-serialization
唯一可用的约束是:
class / struct
new()BaseType / Interface
其中,仅有的两个有点有趣的是:new()(因为XmlSerializer 需要公共无参数构造函数)和:Interface(因为IXmlSerializable 是选项之一) ;但是:
IXmlSerializable 不是必需的,因此不适用简而言之:不,这不是您可以通过通用约束强制执行的事情
【讨论】:
您是对的,答案是否定的,您不能将泛型类型限制为 XML 可序列化。
这样做的原因是 XML 序列化器有一些非常具体的关于它将序列化什么的规则(最值得注意的是,它只序列化公共属性,并且只序列化具有公共无参数构造函数的类型)。使类 XML 可序列化的因素不能用类型来表示,因此无法对其进行通用约束。
您可以限制到一个接口,因此解决方案可能是在您的类型上使用可 XML 可序列化的标记接口。再说一次,如果您不控制要序列化的类型,这将不起作用。
【讨论】: