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?
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.
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 ...
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.
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.
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
analysierenTags und Links c# xml-serialization