Warum ist XmlSerializer so schwer zu benutzen?

7

Ich stelle mir vor, XML-Serialisierung wie folgt zu verwenden:

%Vor%

Bearbeiten: Ich weiß, dass dieser Code falsch ist. Es war nur um zu zeigen, wie ich es benutzen möchte.

Aber das geht gar nicht:

  • XmlSerializer ist nicht generisch. Ich muss von (De-) Serialisierung ablenken und ablehnen.
  • Jede Immobilie muss vollständig öffentlich sein. Warum verwenden wir Reflection nicht nur für den Zugriff auf private Setter?
  • Private Felder können nicht serialisiert werden. Ich möchte private Felder mit einem Attribut ausstatten, damit XmlSerializer sie aufnehmen kann.

Habe ich etwas vermisst und XmlSerializer bietet tatsächlich die beschriebenen Möglichkeiten? Gibt es alternative XML-Serialisierer, die diese Fälle komplexer handhaben?

Wenn nicht: Wir sind schließlich 2010, und .NET gibt es schon seit vielen Jahren. XML-Serialisierung wird oft verwendet, ist völlig standardisiert und sollte wirklich einfach durchzuführen sein. Oder ist mein Verständnis möglicherweise falsch und die XML-Serialisierung sollte die beschriebenen Features nicht aus einem guten Grund aufdecken?

Bearbeiten: Vermächtnis ist kein guter Grund imo. List war zuerst auch nicht-generisch.

(Fühlen Sie sich frei, Untertitel oder Tags anzupassen. Wenn dies CW sein sollte, lassen Sie bitte einfach eine Notiz fallen.)

    
mafu 23.03.2010, 15:46
quelle

5 Antworten

10

Zuerst der festgelegte Code, dann die Antworten auf Ihre Fragen:

%Vor%

oder in 3.0:

%Vor%

(und DataContractSerializer anstelle von XmlSerializer verwenden)

  

XmlSerializer ist nicht generisch. Ich muss bei der (De-) Serialisierung von und abwenden.

Das ist bei Serialisierern üblich. Ich habe meinen eigenen Serialisierer, und anfangs habe ich es vollständig generisch gemacht. Und es stellte sich heraus, dass es sich um einen großen Konstruktionsfehler handelte. Enorm. Nein im Ernst. Ich bin gerade dabei, jede Codezeile neu zu schreiben, um sie auszuschalten.

Einfach; Serialisierer beinhalten im Allgemeinen eine Ebene der Reflexion (entweder für Code-Gen oder für die tatsächliche Arbeit, abhängig von der Implementierung). Reflektion und Generika spielen nicht gut, besonders in einigen Frameworks wie WCF. Den Code zu haben ist ein fairer Kompromiss. Ich habe eine Anzahl von Blogeinträgen auf diesem wenn Sie wirklich wollen ...

  

Jede Eigenschaft muss vollständig öffentlich sein.

Das ist in der Tat eine Einschränkung von XmlSerializer (obwohl eine Liste / Sammlung ohne ein Setter in Ordnung ist, wird ausgelöst, wenn Sie eine öffentliche get und private Menge haben ). Außerdem muss der Typ öffentlich sein und einen parameterlosen Konstruktor haben.

  

Warum verwenden wir Reflection nicht nur für den Zugriff auf private Setter?

Für die Leistung erstellt XmlSerializer spontan eine Assembly, um das zu tun, was Sie möchten. Es hat keinen automatischen Zugriff auf die Interna Ihres Codes. Für Informationen mache ich etwas ähnliches, aber ich biete 2 Generationen an; vollständig statisch (in eine bereitstellbare DLL), die dann nur mit öffentlichen Mitgliedern oder im Speicher funktioniert, die auf private Mitglieder zugreifen können. Ich denke, sie wollten sich nur auf ein Modell festlegen, was sinnvoll ist - und sie brauchten "sgen", was das erste Modell diktiert.

  

Private Felder können nicht serialisiert werden. Ich möchte private Felder mit einem Attribut ausstatten, damit XmlSerializer sie einschließen kann.

Verwenden Sie dann DataContractSerializer , wodurch ein Mitglied (einschließlich privat), das mit [DataMember] markiert ist, serialisiert wird.

    
Marc Gravell 23.03.2010, 16:26
quelle
11

Weitere Informationen finden Sie in der XmlSerializer-Klasse . Sie werden sehen, dass Sie es falsch benutzen. XmlInclude hat einen ganz anderen Zweck.

Sie haben Recht. Der XML-Serializer ist seit .NET 1.0 verfügbar. Das war, bevor wir Generika hatten, BTW, also ist es unwahrscheinlich, dass sie sie unterstützen.

Auch bessere Technologien sind seither angekommen:

  • Der DataContractSerializer ist schneller und unterstützt das Serialisieren als Binärdatei
  • LINQ to XML kann in vielen Serialisierungsszenarien verwendet werden und ist viel flexibler

Es ist unwahrscheinlich, dass der XML-Serializer in Zukunft verbessert wird. Ich empfehle Ihnen, die anderen Alternativen zu lernen.

    
John Saunders 23.03.2010 15:52
quelle
7

1: Vermächtnis. XML-Serializer ist älter als Generika. Es ist wie in .NET 1.0.

2: Designentscheidung. XML-Serializer soll im Vergleich zu anderen Lösungen mit sehr eingeschränkten Rechten arbeiten.

3: wie 2.

Sie können den WCF DataContract-Serializer in Teilen verwenden.

Ihre Annahme ist "limitiert falsch". XML-Serialisierung ist angeblich für Übertragungsdokumente, die in meinen Projekten immer separate Klassen sind, die nichts mehr tun. Als solches habe ich kein Problem mit all den Einschränkungen.

    
TomTom 23.03.2010 15:50
quelle
1

Sie brauchen das nicht [XmlInclude] Wie du es hast. Sie können verwenden [XmlElement] [XmlAttribute] ... Um zu beschreiben, wie die Klasse serialisiert wird.

Nimm das [XmlInclude] heraus und schau, ob das funktioniert.

%Vor%

Aktualisiert, die serialisierten Eigenschaften sollten öffentlich sein.

    
galford13x 23.03.2010 15:53
quelle
0

Übrigens unterstützt DataContract niemals die binäre Serialisierung, serialisiert nach XML, unterstützt aber die Binärcodierung.

    
Kerem Kusmezer 25.03.2010 13:37
quelle

Tags und Links