2017-04-26 4 views
0

私は間違った方法でXmlElementで装飾されたクラスを持っていますが、必要なフィールドを識別できる属性も持っています。C#のXmlSerializerは、特定の属性によって同じ名前の複数のXmlElementで装飾されたクラスを逆シリアル化しますか?

[IWantToSerializeThisAttribute]を変更して、プロパティ名またはXmlElement名を変更すると、コードのメンテナンスが頻繁になるため、他の属性をMySerializableClassに追加できます。ここで

はクラスが定義されている方法は次のとおりです。

[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")] 
を見つけることですので、今、私はおそらくエラーになります

と重複するタグが表示されます。

とにかく私は2つの性質が違う

[IWantToSerializeThisAttribute] 

を持っています。

「IwantToSerializeThisAttribute」プロパティのみをキャッチして評価し、他のプロパティを無視するようにXmlSerializer.Deserializeに指示できますか?

シリアル化をXmlOverrideAttributesで変更することはできませんが、逆シリアル化中に行う方法があります。

ありがとうございました

+0

xmlタグが2つ以上発生している場合、配列が必要です。[XmlElement( "DocumentId")] public List DOC_ID {get;セット; } – jdweng

+0

明白な答えはあなたがそれが使用されることを望んでいないので、属性を削除することです。なぜあなたはシリアル化したくないプロパティに 'XmlElement'属性を持っていますか? –

+0

私たちにあなたのXMLを教えてください。 –

答えて

1

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

0

ない私が正しく理解しますが、私はあなたにいくつかの選択肢を与えることを試してみましょうかどうかわから:

は、私が何らかの方法XmlSerializer.Deserializeを伝えることができるの"IwantToSerializeThisAttribute"プロパティだけをキャッチして評価し、他のプロパティは無視しますか?

特定のプロパティのみをシリアル化する場合は、除外するプロパティに[XmlIgnore]属性を使用します。しかし、もし何らかの理由(DOC_CODE_FOR_EMPLOYEESDOC_ID_FOR_EMPLOYEES

ためしかし、あなたはデシリアライズしながら、それが唯一の省略されなければならないが、直列化はまだ私はIXmlSerializableの実装について考えたいすべてのプロパティのために行われるべきであることを意味します。このようにして、xmlを読み書きする方法を具体的に指定することができます。

+0

XmlAttributeOverridesで解決しました。 – Wasted

関連する問題