Frage

Ich bin auf diese Frage zu Transzender gestoßen:

Was sollten Sie für ein Feld anwenden, wenn sein Wert während der Deserialisierung nicht erforderlich ist?

Me = [nichtserialisiert], Antwort = [OptionalField

Meine Darmreaktion war nicht sserialisiert, aber Transzender sagt, ich lege falsch. Ich habe eine gute Idee, wonach ich achten muss, was das [nicht erzeugte] Attribut betrifft, aber ich würde es trotzdem wirklich mögen, dass dies klar ist.

Soweit ich das erstere beurteilen kann, hat eine Beziehung zu Versionskonflikten zwischen neueren und älteren Versionen derselben Versammlung. Letzteres befasst sich mehr mit der Serialisierung eines Feldes Fullstop. Gibt es noch etwas, das diese beiden auszeichnet? MSDN sagt nicht wirklich viel darüber aus, da beide auf den Binaryformatters und Seifenformatoren mit dem xmlFormatter unter Verwendung des xmlignoreattribute verwendet werden.

Meine zweite Frage ist, dass Sie eines der beiden Attribute mischen und anpassen können? Ich habe sie noch nicht benutzt.

Wenn Sie diesen nur dort rauswerfen, hat meine Antwort etwas mit der Art und Weise zu tun, wie [OnDeserialized] und die IdeserilizationCallback -Schnittstelle implementiert ist?

AKTUALISIEREN:

Ich weiß, dass das optionale Feldattribut den von einem Datenmitglied gehaltenen Wert nicht serialisiert, jedoch nicht einmal das Datenmitglied oder seinen Wert serialisiert.

War es hilfreich?

Lösung

Diese beiden Attribute werden für gegenüberliegende Seiten der Serialisierungsgleichung verwendet.

Wenn Sie verwenden [NonSerialized], Sie sagen: "Dieses Feld sollte überhaupt nicht serialisiert werden" - also ist es eher ein "Zeitsparen" -Merkmal. Grundsätzlich sagen Sie, dass das Feld für den serialisierten Zustand des Objekts keine Rolle spielt.

Wenn Sie verwenden [OptionalField], Andererseits werden Sie das Feld immer noch serialisieren. Wenn das Feld jedoch ist fehlen bei Lesezeit (Wenn der Strom in ein Objekt deserialisiert wird), wird keine Ausnahme angehoben. Dieses Attribut soll wirklich ein neues Feld zu einem vorhandenen serialisierbaren Typ hinzufügen, ohne die Kompatibilität zu brechen. Ältere Versionen des Objekts (die dieses Feld fehlen) werden normal deserialisiert.

Andere Tipps

Nur die englische Sprache abspielen, nicht benötigt und Optional meine in diesem Fall dasselbe.

Für Ihre erste Frage haben Sie es so ziemlich auf den Kopf genagelt. [OptionalField] Im Grunde genommen können ältere Serialisierungen mit neueren Definitionen kompatibel sein. [NonSerialized] bedeutet, dass Sie es in den serialisierten Daten nicht finden.

Angesichts der Unterschiede kann ich mir nicht vorstellen, warum Sie beide auf ein einzelnes Feld setzen würden, aber ich würde vermuten, dass der Compiler sich beschweren würde.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top