加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

.net – XML序列化继承类时的InvalidOperationException

发布时间:2020-12-16 23:08:20 所属栏目:百科 来源:网络整理
导读:我在将c#类序列化为具有基类的 XML文件时出现问题…这是一个简单的示例: namespace Domain{ [Serializable] public class ClassA { public virtual int MyProperty { get; set; } }}namespace Derived{ public class ClassA : Domain.ClassA { public overr
我在将c#类序列化为具有基类的 XML文件时出现问题…这是一个简单的示例:

namespace Domain
{
   [Serializable]
   public class ClassA
   {
      public virtual int MyProperty
      {
         get; set;
      }
   }
}

namespace Derived
{
   public class ClassA : Domain.ClassA
   {
      public override int MyProperty
      {
         get { return 1; } set { /* Do Nothing */ }
      }
   }
}

当我尝试序列化Derived.ClassA的实例时,我收到以下异常:

InvalidOperationException(Types’Domain.ClassA’和’Derived.ClassA’都使用XML类型名称’ClassA’,来自命名空间“.使用XML属性为该类型指定唯一的XML名称和/或命名空间.)

问题是我想创建一个简单定义XML文件结构的基类,然后允许其他任何人从该类派生以插入业务规则,但格式化将来自基础.

这是可能的,如果是这样,我如何归属基类来允许这个?

解决方法

如果您可以将派生类重命名为与其基类不同的内容,则可以使用 XmlAttributeOverrides执行此操作:

// For ClassB,which derives from ClassA
XmlAttributes          attributes  = new XmlAttributes();                        
attributes.XmlRoot                 = new XmlRootAttribute("ClassA");

XmlAttributeOverrides  overrides   = new XmlAttributeOverrides();
overrides.Add(typeof(ClassB),attributes);

XmlSerializer   serializer  = new XmlSerializer(typeof(ClassB),overrides);

这将序列化为< ClassA> …< / ClassA>并可以从那序列化为ClassB实例.

据我所知,当基类和派生类具有相同的名称时(除了通过Data Contract Surrogates或其他一些过度杀伤方法完全控制序列化过程之外),没有办法做到这一点.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读