Frage

Ich bin auf der Suche durch einig vorhandenen Code in einem Projekt arbeite ich an, und ich fand eine Klasse, die als implementiert:

public class ThingOne
{
    private int A;

    private int B;

    [NonSerialized]
    private System.Timers.Timer timer1;
}

Sollte es nicht eher wie das?

[Serializable]
public class ThingOne
{
    private int A;

    private int B;

    [NonSerialized]
    private System.Timers.Timer timer1;
}

Oder gibt es einige zusätzliche Nutzen für die Zugabe von [NonSerialized], selbst wenn die Klasse selbst ist nicht Serializable?

War es hilfreich?

Lösung

NonSerialized keine Wirkung, wenn Serializable nicht verwendet wird. Standardmäßig Klassen und ihre Mitglieder sind nicht serialisierbar.

Der einzige Vorteil von etwas erklärt NonSerialized, wenn die Klasse serialisiert wird nicht unter den gegebenen Umständen ist, dass die Klasse von einem serialisierten Objekt geerbt wird, und dann wird das geerbte Member nicht serialisierbaren sein.

Von MSDN :

Attribut 'NonSerialized' wird nicht Auswirkungen auf dieses Mitglied, weil sein enthaltenden Klasse wird nicht ausgesetzt, wie 'Serializable'.

In der Standardeinstellung Klassen und ihre Mitglieder sind nicht serialisierbar. Das NonSerializedAttribute Attribut wird nur dann benötigt, wenn ein Mitglied einer serializable Klasse sollte nicht serialisiert werden.

Andere Tipps

Oder gibt es einige zusätzliche Nutzen für die Zugabe von [NonSerialized], selbst wenn die Klasse selbst ist nicht Serializable?

Die Klasse ist nicht verschlossen, so eine andere Klasse von diesem Objekt erben könnte. Diese Klasse könnte als Serializable markiert werden, und dann das NotSerializable Attribut würde ins Spiel kommen. (Obwohl wie erwähnt nicht für private Mitglieder).

Denken Sie daran, Sie Attribute durch Reflexion überprüfen. Es kann nicht von der Laufzeit verwendet werden, um zu überprüfen, was sollte und soll nicht serialisiert werden, es als Marker für etwas anderes im Programm Umgang mit irgendeiner Art von benutzerdefinierter Serialisierung verwendet werden könnte (ich sage nicht, das ist eine gute Idee, in das Mindeste).

kann ich aus zwei Gründen denken:

  1. Es könnte von entscheidender Bedeutung sein, dass das Feld nicht serialisiert wird. Wenn also in Zukunft die Klasse serialisable gemacht wird, wird dies kein Fehler, Ineffizienz oder Sicherheitsproblem einführen, weil ohne sie die Klasse serialisable Kennzeichnung auch so für den Bereich tun wird.

  2. Sie könnten eine Art individueller Verwendung des Attributs tun

Im Fall 2, es wird in dem Code von anderswo klar sein, dass das ist, was passiert. Die Nummer 1 ist gute Praxis aber.

Fall 1 gute Praxis ist es wert sein kann YAGNI Ausgleich ( "You Are not Gonna Need It" - keine Arbeit tun "falls es benötigt wird später") mit Berücksichtigung „in Ordnung, aber wenn ich brauche es später, es wird eine Katastrophe, wenn jemand vermisst, dass dieses Feld eine Ausnahme ist.

So, während es keine Wirkung hat hier, es ist auf jeden Fall eine gute Praxis für Szenarien, in denen es beginnt eine Wirkung zu haben.

Edit: Ein andere Möglichkeit ist, dass es von einer früheren Version Cruft wird, wo es in der Tat serialisable war oder der Autor war in zwei Köpfen zu der Zeit, und es war nie ganz „fertig“ (arbeitet Code jemals fertig vollständig?). Nur weil etwas im Code ist, bedeutet nicht, es gemeint war, so zu sein. Dennoch, wenn es wirklich wichtig ist, dass etwas nicht serialisiert werden, sage ich immer noch gute Praxis ist es dies aus dem Grunde, oben gegeben zu markieren.

MSDN SerializeAttribute besagt, dass „Wenden sie das SerializableAttribute Attribut auf eine Art, um anzuzeigen, dass Instanzen dieses Typs serialisiert werden kann.“ Dies bedeutet, dass ohne sie kann die Klasse nicht serialisiert werden. Ich glaube, ich habe dies versucht und die serialize eine Exception aus, wenn es auf einem NonSerializable Typ versucht wird.

Ich stimme mit Greg, MSDN heißt es in ähnlicher Weise unter Berufung auf Referenzen ist eine gute Idee ..

„Standardmäßig Klassen und ihre Mitglieder sind nicht serialisierbar. Die NonSerializedAttribute Attribut nur, wenn ein Mitglied einer serializable Klasse benötigt wird, soll nicht serialisiert werden.“

http://msdn.microsoft.com/ en-us / library / dwys85sk (VS.80) aspx

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