XmlSerializer-Performance-Problem, wenn die Angabe XmlRootAttribute
Ich bin gerade ein echt komisches Problem und ich kann nicht scheinen, um herauszufinden, wie es zu lösen.
Habe ich eine ziemlich komplexen Typ, die ich bin versucht zu serialisieren mithilfe der XmlSerializer-Klasse. Dieses funktioniert eigentlich gut und der Typ serialisiert richtig, aber scheint eine sehr lange Zeit dabei; um die 5 Sekunden, je nachdem, welche Daten in das Objekt.
Nach ein bisschen zu Profilieren, ich habe verengt das Thema down - Bizarr - mit der Angabe eines XmlRootAttribute beim Aufruf von XmlSerializer.Serialisieren. Ich Tue dies ändern Sie den Namen einer Sammlung, die serialisiert werden von ArrayOf zu etwas ein bisschen mehr Bedeutung. Nachdem ich entfernen Sie die parameter der operation ist fast instant!
Irgendwelche Gedanken oder Anregungen wäre sehr gut, da bin ich völlig ratlos auf diese!
- Okay, sieht aus wie das Problem ist, dass die Serialisierungs-assembly generiert wird für jeden serializer Beispiel, wenn Sie angeben, alles andere als eine Art parameter der serializer! Das ist, warum - ich nehme an - ich sehe so schreckliche Leistung. Weiß jemand einen Grund, warum die Standard XmlSerializer dies zu tun wäre? Ich verstehe nicht, warum nur die Angabe der root-node name würde bedeuten, das der cache nicht genutzt werden?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nur für jemand anderes, der läuft in diesem problem; bewaffnet mit die obige Antwort und das Beispiel aus der MSDN habe ich es geschafft dieses Problem zu beheben, verwenden Sie die folgende Klasse:
Dann, anstatt die Standard-XmlSerializer-Konstruktor nimmt eine XmlRootAttribute, verwende ich im folgenden statt:
Meine Anwendung ist nun die Durchführung wieder!
Wie bereits in der follow-up-Kommentar zu der ursprünglichen Frage .NETTO emittiert Baugruppen bei der Erstellung XmlSerializers, und speichert die generierte assembly, wenn es erstellt wird, mithilfe einer der folgenden zwei Konstruktoren:
Baugruppen, die mit Hilfe der anderen Konstruktoren werden nicht zwischengespeichert, so .NET hat zum generieren von neuen Baugruppen zu jeder Zeit.
Warum? Diese Antwort wohl nicht sehr befriedigend, aber peering diesem Reflektor können Sie sehen, dass der Schlüssel, der verwendet wird, um zu speichern und den Zugriff auf die generierten
XmlSerializer
Baugruppen (TempAssemblyCacheKey
) ist nur eine einfache composite-Schlüssel erstellt, aus der serialisierbaren Typ und (Optional) dessen namespace.Somit gibt es keinen Mechanismus, um zu sagen, ob eine zwischengespeicherte
XmlSerializer
fürSomeType
hat eine BesondereXmlRootAttribute
oder die Standard-Einstellung.Es ist schwer zu denken, der einen technischen Grund, dass der Schlüssel konnte nicht Platz für mehr Elemente, so ist dies wohl nur ein feature, dass niemand die Zeit hatte, zu realisieren (vor allem, da es bedeuten würde das ändern sonst stabile Klassen).
Können Sie dies gesehen haben, aber in Fall, dass Sie nicht, die
XmlSerializer
- Klasse Dokumentation beschreibt einen workaround:(Ich habe die weggelassen Beispiel hier)
Musste einfach etwas umzusetzen, wie dies und verwendet eine leicht optimierte version von @Dougc Lösung mit einer Komfort-überlastung:
Es ist eine komplexere Umsetzung erklärt hier. Aber das Projekt ist nicht mehr aktiv.
Den relevanten Klassen sind hier sichtbar:
http://mvpxml.codeplex.com/SourceControl/changeset/view/64156#258382
Insbesondere die folgenden Funktion, um einen eindeutigen Schlüssel generieren können nützlich sein: