C# 中的 XmlSerializer,通过特定属性反序列化装饰有多个具有相同名称的 XmlElement 的 class?

XmlSerializer in C#, deserialize a class decorated with multiple XmlElement with same name by a particular attribute?

我有一个 class 以错误的方式用 XmlElement 装饰,但它也有一些属性可以让我识别我需要的字段。

我只能修改 [IWantToSerializeThisAttribute] 并将其他属性添加到 MySerializableClass,因为对 属性 名称或 XmlElement 名称的任何修改都将涉及繁重的编码维护工作。

class 的定义如下:

 [XmlRoot("ARandomXmlRoot")]
    public class MySerializableClass
    {

        //CAMPI DIR_DOCUMENTI
        //[MetadatoDocumentoAlfresco] è un attributo che serve per selezionare i campi per l'aggiornamento dati massivo su alfresco
        [IWantToSerializeThisAttribute]
        [XmlElement("DocumentCode")]
        public string DOC_CODE { get; set; }

        [IWantToSerializeThisAttribute]
        [XmlElement("DocumentId")]
        public string DOC_ID { get; set; }

        [XmlElement("DocumentCode")]
        public string DOC_CODE_FOR_EMPLOYEES { get; set; }

        [XmlElement("DocumentId")]
        public string DOC_ID_FOR_EMPLOYEES { get; set; }

    }

现在,如果我这样做

XmlSerializer.Deserialize(xmlString, typeof(MySerializableClass));

我很可能会收到一个错误,因为 XmlSerializer 找到的是

的 2 倍
[XmlElement("DocumentCode")]

发现这是一个重复的标签。

反正我有一个

[IWantToSerializeThisAttribute]

这使得 2 个属性不同。

我能否以某种方式告诉 XmlSerializer.Deserialize 只捕获和评估 "IwantToSerializeThisAttribute" 属性而忽略其他属性?

我无法使用 XmlOverrideAttributes 更改序列化,但也许在反序列化过程中有一些方法可以做到这一点。

谢谢大家

尝试使用 XmlOverrideAttributes 和反射。使用 LINQ 只是为了让它更短。

这对我有用:

 string XmlString = "<ARandomXmlRoot> XML HERE </ARandomXmlRoot>";
            XmlAttributeOverrides overrides = new XmlAttributeOverrides();

            //Select fields I DON'T WANT TO SERIALIZE because they throw exception
            string[] properties = (new MySerializableClass())
                .GetType().GetProperties()
                .Where(p => !Attribute.IsDefined(p, typeof(IWantToSerializeThisAttribute)))
                .Select(p => p.Name);

            //Add an XmlIgnore attribute to them
            properties.ToList().ForEach(field => overrides.Add(typeof(MySerializableClass), field, new XmlAttributes() { XmlIgnore = true }));

            MySerializableClass doc = new MySerializableClass();

            XmlSerializer serializerObj = new XmlSerializer(typeof(MySerializableClass), overrides);
            using (StringReader reader = new StringReader(xmlString))
            {
                doc = (MySerializableClass)serializerObj.Deserialize(reader);
            };

干杯

不确定我是否理解正确,但让我试着给你一些选择:

Can I tell someway XmlSerializer.Deserialize to catch and valorize only the "IwantToSerializeThisAttribute" properties and ignore the others?

如果您只想序列化特定属性,请对要忽略的属性使用 [XmlIgnore] 属性。但是如果出于某种原因 (DOC_CODE_FOR_EMPLOYEES and DOC_ID_FOR_EMPLOYEES)

但是如果你的意思是它应该只在反序列化时被省略,但仍然应该对所有属性进行序列化,我会考虑实现 IXmlSerializable。通过这种方式,您可以具体提供您希望如何 read/write 您的 xml.