【问题标题】:Implementing IXmlSerializable on a generated class that has XmlTypeAttribute在具有 XmlTypeAttribute 的生成类上实现 IXmlSerializable
【发布时间】:2010-04-26 13:41:02
【问题描述】:

基本上,最初的问题是我需要将布尔值序列化为 0 或 1。我找到的解决方案是实现 IXmlSerializable,我做到了。不幸的是,我试图序列化的类是从模式生成的代码,并且上面有一个 XmlTypeAttribute。当我尝试使用以通常方式(new XmlSerializer(type))创建的 XmlSerializer 对对象进行(反)序列化时,它会引发此异常:

System.InvalidOperationException: Only XmlRoot attribute may be specified for the type ______ Please use XmlSchemaProviderAttribute to specify schema type.

立即想到两个选项:

1) 删除生成代码中的属性。 每次重新生成代码时都必须进行此更改。

2) 在创建序列化程序时使用 XmlAttributeOverrides 对象来移除属性。这将要求代码库的其余部分“知道”它需要覆盖该属性。此外,抛出的异常绝对不提供关于需要做什么来修复它的任何线索。

这两个选项有点臭。还有第三种选择吗?

【问题讨论】:

  • 为什么它有[XmlType]属性?
  • 这就是 Xsd2Code 生成它的方式。说我使用的模式是一头巨大的野兽是轻描淡写的。 Xsd.exe 和其他工具使用自定义库崩溃或吐出 40mb 的代码。由于其他原因,我最终不得不修改生成的代码。但是,如果有解决此问题的第三种方法,它也可能适用于另一种方法。

标签: c# .net xml-serialization ixmlserializable xmltype


【解决方案1】:

我有同样的问题,对我来说删除 IXMLSerializable 作品,我不使用它,你有没有尝试用属性中的一些逻辑隐藏真假?像这样:

private bool mblnFlag;

public String Flag 
{
   get
   {
      return mblnFlag;
   }
   set
   {
      mblnFlag = (value == "1")
   }
}

当然你应该增强属性并做更多的检查,但这就是想法。

【讨论】:

  • 我通过注释掉 XmlTypeAttribute 解决了我的问题,但是修改生成代码感觉很脏,我希望有第三个选项不涉及修改生成的代码。我可能只是在做梦:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-30
  • 2010-10-31
  • 2012-12-17
  • 1970-01-01
  • 1970-01-01
  • 2010-09-21
相关资源
最近更新 更多