XmlSerializer在C#中,用一个特定的属性反序列化一个具有相同名称的多个XmlElement装饰的类?

问题描述:

我有一个以错误的方式用XmlElement装饰的类,但它也具有可以让我识别我需要的字段的属性。XmlSerializer在C#中,用一个特定的属性反序列化一个具有相同名称的多个XmlElement装饰的类?

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

这里是如何类已经被定义为:

[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更改序列化,但也许有一些方法可以在反序列化过程中完成。

谢谢大家

+0

如果xml标签发生了两次比您需要的数组:[XmlElement(“DocumentId”)] public List DOC_ID {get;组; } – jdweng

+0

显而易见的答案是删除该属性,因为您不希望它被使用。为什么你不希望序列化的属性上有'XmlElement'属性? –

+0

向我们展示您的xml。 –

尝试使用XmlOverrideAttributes和Reflection。使用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); 
      }; 

干杯

+0

这就是我正在寻找的,因为允许我仅在需要时才会执行动态xml序列化/反序列化,不包括字段 – Wasted

不知道如果我理解正确的,但让我尝试给你一些选项:

我能告诉好歹XmlSerializer.Deserialize只捕获和确定“IwantToSerializeThisAttribute”属性并忽略其他属性?

如果要仅序列化特定属性,请使用[XmlIgnore]属性来指定要忽略的属性。但是,如果由于某种原因(DOC_CODE_FOR_EMPLOYEESDOC_ID_FOR_EMPLOYEES

但是,如果你的意思是,它应该反序列化只能省略,但系列化仍应为我想想实施IXmlSerializable所有属性来完成。这样你可以专门提供你想要如何读/写你的XML。

+0

使用XmlAttributeOverrides – Wasted