XmlSerializer, GenerateSerializer und Collections

8

Wir haben einige Setup-Klassen in unserem Projekt, die mit XmlSerializer aus einigen .config-Dateien serialisiert / deserialisiert werden. In einigen dieser Setup-Klassen haben wir Sammlungen von Sub-Setups wie folgt:

%Vor%

Wir verwenden das Attribut [XmlSerializerAssembly], um die beste Leistung zum Lesen und Schreiben der Setups zu erzielen. Und hier ist mein Problem: Wir verwenden Collection, um die CA-Warnung "Verwenden Sie keine Arrays" zu vermeiden. Wenn wir den Setter von SubSetups öffentlich machen, erhalten wir die CA-Warnung CA2227 "Machen Sie den Setter einer Sammlung nicht öffentlich". Wenn wir den Setter der Eigenschaft SubSetups privat machen (wie im Codebeispiel), erhalten wir einen Fehler im generierten Serializer. Die Methode "GenerateSerializer" (in einem Tool von uns aufgerufen) der Code hat eine Zeile wie folgt:

%Vor%

Wenn wir den Setter privat machen, erhalten wir beim Aufbau des Serialisierers einen CS0200 "Property SubSetups kann nicht zugewiesen werden". Weiß jemand, wie man ein korrektes Setup mit einem generierten Serializer vornimmt, ohne eine CA-Warnung zu unterdrücken?

    
Fischermaen 18.12.2012, 08:13
quelle

6 Antworten

4

Es ist schwer zu sagen: Ein "richtiges" Setup hängt stark vom Kontext ab. Nur eine kurze Idee: Was passiert, wenn Sie die Logik von "GenerateSerializer" in den Eigenschaften-Getter verschieben? Wäre es akzeptabel?

%Vor%

Auf diese Weise erhalten Sie in "GenerateSerializer" nur die Sammlung. Wenn die Sammlung noch nicht erstellt wurde, befindet sie sich im Getter, ohne dass sie außerhalb der Klasse erstellt werden muss. Nur eine Idee, lass es mich wissen, wenn es nicht anwendbar ist.

    
Lorenzo Dematté 30.01.2013 11:11
quelle
3

Wenn die Situation so einfach ist wie es scheint, dann müssen Sie nicht überprüfen, ob (o.SubSetups == null) , weil Sie die Zeile SubSetups = new Collection<SubSetupXml>(); im Konstruktor SetupXml() haben (das heißt, natürlich, wenn o ist vom Typ SetupXml ). Wenn Sie diese if -Anweisung von der GenerateSerializer -Methode loswerden und den Setter privat machen, sollten Sie in Ordnung sein - es gibt keine Möglichkeit, dass die SubSetups -Eigenschaft null sein kann, es sei denn, es gibt andere Möglichkeiten, damit herumzuspielen das hast du nicht erwähnt ...

    
Grx70 30.01.2013 15:32
quelle
3

Sie könnten so etwas haben:

%Vor%

Es ist nicht perfekt, aber das Attribut EditorBrowsable verhindert, dass Entwickler diese Bibliothek verwenden (aus einem anderen Assembly), um sie in IntelliSense / AutoCompletion-Tools anzuzeigen. Und das GeneratedCode-Attribut verhindert eine CA-Warnung.

    
Simon Mourier 31.01.2013 15:00
quelle
3

Ich nehme an, dass Sie diesen Artikel bereits konsultiert haben? Ссылка

Dies scheint mir eine wichtige Anmerkung in diesem Artikel zu sein: "Sowohl die Binär- als auch die XML-Serialisierung unterstützt schreibgeschützte Eigenschaften, die Sammlungen sind. Die Klasse System.Xml.Serialization.XmlSerializer hat bestimmte Anforderungen für Typen, die ICollection und System.Collections.IEnumerable implementieren, um serialisierbar zu sein."

Außerdem können Sie möglicherweise mit dem dort beschriebenen .Clear () - und dann .AddRange () -Ansatz weitere Fortschritte erzielen.

    
JoeKir 01.02.2013 17:32
quelle
3

Sie können versuchen, die IXmlSerializable-Schnittstelle zu implementieren. Es erfordert ein wenig mehr Arbeit, aber es gibt Ihnen eine genaue Kontrolle über die Serialisierung und in Ihrem Fall den Zugriff auf die privaten Klassenvariablen. In der ReadXml-Methode müssen Sie nur Ihre Sammlung erstellen und eine Instanz erstellen, über jeden Knoten in der Quell-XML-Datei iterieren und den Wert

analysieren     
Radin Gospodinov 02.02.2013 20:20
quelle
3

Wenn Sie den Typ von SubSetups in IEnumerable ändern, wird die Warnung zur Codeanalyse gelöscht, aber ich kann nicht sagen, ob dies für Sie geeignet ist.

%Vor%     
Phil 30.01.2013 18:29
quelle

Tags und Links