C# XML转POCO:同一xsi:type被多元素复用的序列化问题
XML反序列化C# POCO类型冲突解决方案
核心思路
通过显式指定XML类型别名解决命名冲突,同时补全所有多态类型的[XmlInclude]声明,让序列化器能识别所有xsi:type对应的子类。
具体步骤
给冲突类指定唯一XML类型名
当Element类与SlotValue的子类命名冲突时,给Element添加[XmlType]属性并指定一个XML端唯一的别名,避免与子类的xsi:type值重复:[XmlType("ElementEntity")] // 自定义XML类型别名,和SlotValue子类的xsi:type区分开 public class Element { // 原工具生成的类成员 public AnyValueType AnyValue { get; set; } }补全所有多态类型的XmlInclude声明
不仅在SlotValue的父类上添加[XmlInclude],还要在AnyValueType的父类(或包含AnyValue属性的类)上,添加所有可能的子类类型声明:[XmlInclude(typeof(StringAnyValue))] [XmlInclude(typeof(IntAnyValue))] // 其他AnyValueType的子类都要添加 public class AnyValueType { // 类成员 }修正工具生成的类的多态属性配置
确保包含多态属性的字段/属性,配置正确的XmlElement属性,明确指定基类类型:public class ParentClass { [XmlElement(Type = typeof(AnyValueType))] public AnyValueType AnyValue { get; set; } }验证XML与C#类型的映射匹配
检查XML中的xsi:type值是否与C#类的[XmlType]别名完全一致,比如XML中如果是xsi:type="ElementEntity",则对应C#的Element类的XmlType别名必须完全匹配。
内容的提问来源于stack exchange,提问作者DeleteSystem32
相关产品推荐
相关产品推荐

