2017-02-16 14 views
1

Wie ignoriere ich während der Deserialisierung eine Eigenschaft? In meinem Fall möchte ich die Eigenschaft FullName überhaupt nicht initialisiert bekommen. Ich bin nicht auf der Suche nach [XMLIgnore] Lösungen - denke, dass es ein Szenario ist, in dem ich keinen Zugriff habe, um die Klasse zu ändern.C# Xml Deserialize, Daten in XML ignorieren

Hier ist meine Klasse:

public class Person 
{ 
    public int Id { get; set; } 
    public string FullName { get; set; } 
} 

Hier ist, wie ich die Initialisierung:

Person p1 = new Person() { Id = 1, FullName = "P1" }; 
Person p2 = new Person() { Id = 2, FullName = "P2" }; 
List<Person> persons = new List<Person> { p, q }; //this object is xml serialized. 

Und hier ist mein XML: (ich es aber die XML-Serialisierung bekam)

<?xml version="1.0" encoding="utf-8"?> 
<ArrayOfPerson xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Person> 
    <Id>1</Id> 
    <FullName>P1</FullName> 
    </Person> 
    <Person> 
    <Id>2</Id> 
    <FullName>P2</FullName> 
    </Person> 
</ArrayOfPerson> 
+0

Eine sehr brutale Lösung (wenn Sie nicht zu viele Eigenschaften in Ihrem tatsächlichen Code haben) wäre, eine neue _temporary_ Klasse zu erstellen, z. Person2, mit allen Feldern außer demjenigen, den Sie ignorieren möchten. Verwenden Sie das zum Serialisieren. Während der Deserialisierung können Sie immer noch die ursprüngliche Klasse verwenden. Es wird nur den ignorierten Wert als null belassen. Wenn der Name der Klasse jedoch für Sie im XML wichtig ist, ist dieser Vorschlag nicht hilfreich. –

+0

Dies könnte Ihnen helfen, wenn mein erster Vorschlag nicht. [Ignoriere eine Eigenschaft während der XML-Serialisierung, aber nicht während der Deserialisierung] (http://stackoverflow.com/a/18242538/6741868). Ein anderes Beispiel für die gleiche Override-Methode ist [Ignore a property beim Serialisieren nach XML] (http://stackoverflow.com/a/23121696/6741868) –

+0

danke für Ihre Eingaben, aber die XMLAttributeOverrides hilft, wenn der Elementname in der XML ist anders als der Klasseneigenschaftsname. – Sekhar

Antwort

2

Sie kann einen benutzerdefinierten XmlReader im Deserialisierungsprozess verwenden, der die FullName Elemente einfach überspringt. Etwas wie folgt aus:

public class MyXmlReader : XmlTextReader 
{ 
    public MyXmlReader(string filePath) : base(filePath) 
    { 
    } 

    public override bool Read() 
    { 
     if (base.Read()) 
     { 
      if (Name == "FullName") 
       return base.Read(); 

      return true; 
     } 

     return false; 
    } 
} 

dann verwenden, wie diese

var serializer = new XmlSerializer(typeof(List<Person>)); 

using (var reader = new MyXmlReader("XMLFile.xml")) 
{ 
    var person = (List<Person>)serializer.Deserialize(reader); 
} 

Sie können einen anderen Konstruktor implementieren einen Stream zu nehmen oder was auch immer Sie haben. Es muss kein Dateipfad sein.

+0

vielen dank! es ist eine sehr saubere Lösung – Sekhar