2009-07-20 5 views
3

Ich teste XML-Serialisierung in meiner Klasse, aber ich bemerkte, dass die ID-Nummer nicht gespeichert wurde, wenn ich das Programm ausführte.Erfordert die XML-Serialisierung das Lesen/Schreiben von Eigenschaften?

Also sah ich mich um und änderte ein paar Dinge, aber nichts funktionierte, dann sah ich, dass alle Felder außer ID sowohl get und set Eigenschaften hatten. Also habe ich ein Set hinzugefügt; Eigenschaft zu meiner ID-Nummer und poof es funktionierte. Die Frage ist, muss es festgelegt werden; und bekomme; Funktion für alle meine Eigenschaften für die XML-Serialisierung funktioniert?

Ich möchte nicht die ID-Nummer geändert werden, nachdem das Objekt erstellt wurde (es wird automatisch generiert).

Antwort

5

Ja, das ist im Grunde eine Einschränkung der XML-Serialisierung. Vom XML Serialization docs:

nur öffentliche Eigenschaften und Felder können serialisiert werden. Eigenschaften müssen öffentliche Zugriffsmethoden haben (get und set Methoden). Wenn Sie nicht öffentliche Daten serialisieren müssen, verwenden Sie die BinaryFormatter-Klasse statt XML Serialisierung.

XML-Serialisierung ist nicht so flexibel, wie man es sich wünscht.

+0

Ich bemerkte, dass er nicht erwähnte, welche Version des Frameworks er verwendete. Wurde das in .NET 3.5 nicht geändert? –

+0

@Justin - nicht AFAIK. –

+0

Während es ein wörtliches Zitat von MSDN sein kann, würde ich BinarySerializer nicht unbedingt als eine Alternative für jene Szenarios empfehlen, wo xml die vorherige Option war ... –

0

Beachten Sie, dass DataContractSerializer nützlich sein kann, wenn Sie nicht öffentliche Daten als XML serialisieren möchten. Es ist nicht so flexibel wie XmlSerializer (und Sie können nicht angeben, Attribute), aber es kann nicht-öffentliche Daten serialisiert:

[DataContract] 
public class Person { 
    [DataMember] 
    private int id; 

    public int Id {get {return id;}} // immutable 

    public Person(int id) { this.id = id; } 

    [DataMember] 
    public string Name {get;set;} // mutable 
} 

Beachten Sie auch, dass es nicht Ihre Konstruktor nicht verwendet ... oder in der Tat alle Konstruktor - es schummelt, so dass es ein Objekt erstellen und die Daten anschließend ausfüllen.

Verwandte Themen