使用System.Xml.Serialization反序列化XML时优先选择Element1值的实现方法咨询
System.Xml.Serialization反序列化XML时优先选择Element1值的实现方法咨询
嗨,我来帮你搞定这个问题!你现在遇到的核心需求是:反序列化XML时,只要<Element1>存在就优先用它的值,只有当<Element1>不存在时才 fallback 到<Element2>。但你当前的写法会让最后出现的元素覆盖前面的,没法保证Element1的优先级,我给你推荐一个简单直接的解决方案:
方案:拆分属性,通过公共属性实现优先级判断
你可以分别为Element1和Element2创建单独的序列化属性,再用一个不参与序列化的公共属性来返回符合优先级逻辑的值。代码示例如下:
// 让XmlSerializer分别解析XML中的两个元素 [XmlElement("Element1")] public string Element1 { get; set; } [XmlElement("Element2")] public string Element2 { get; set; } // 这个属性不参与XML序列化,只对外提供我们需要的优先值 [XmlIgnore] public string Data { get { // 优先取Element1的值,为空时再用Element2 return !string.IsNullOrEmpty(Element1) ? Element1 : Element2; } set { // 如果需要序列化这个值,直接赋值给Element1(符合优先逻辑) Element1 = value; } }
方案原理
当XmlSerializer反序列化XML时,会自动把<Element1>的内容赋值给Element1属性,<Element2>的内容赋值给Element2属性。之后你通过Data属性的get访问器,就能确保无论XML中两个元素的顺序如何,只要<Element1>存在就优先用它的值。
你原有写法的问题
你之前给同一个Data属性加两个[XmlElement]标记,这种写法的逻辑是最后出现的元素会覆盖前面的。比如XML里先写<Element1>再写<Element2>,Data会拿到Element2的值,完全违背了优先Element1的需求,所以这种写法不适用。
如果不想让外部看到Element1和Element2这两个属性,你可以把它们设为私有,但要注意XmlSerializer默认不处理私有成员,这时候需要额外用XmlAttributeOverrides显式指定序列化私有属性——不过一般来说用公共属性就足够满足需求啦。
备注:内容来源于stack exchange,提问作者ranger
相关产品推荐
相关产品推荐

