Domanda

Sto cercando attraverso alcuni codice esistente in un progetto su cui sto lavorando, e ho trovato una classe che viene implementata come:

public class ThingOne
{
    private int A;

    private int B;

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

Non dovrebbe più simile a questo?

[Serializable]
public class ThingOne
{
    private int A;

    private int B;

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

O c'è qualche ulteriore vantaggio per l'aggiunta di [NonSerialized] anche quando la classe stessa non è Serializable?

È stato utile?

Soluzione

NonSerialized non avrà alcun effetto quando Serializable non viene utilizzato. Per impostazione predefinita, le classi ei loro membri non sono serializzabile.

L'unico vantaggio di dichiarare qualcosa NonSerialized quando la classe non è serializzato è sotto le circostanze che la classe viene ereditata da un oggetto serializzato, e quindi il membro ereditato sarà non serializzabile.

Da MSDN :

  

attributo 'NonSerialized' non lo farà   influenzare questo utente perché la sua   classe contenente non è esposto come   'Serializable'.

     

Per impostazione predefinita, le classi ei loro membri sono non serializzabile. L'attributo NonSerializedAttribute è necessaria solo se un membro di una classe serializzabile non deve essere serializzato.

Altri suggerimenti

  

O c'è qualche ulteriore vantaggio per l'aggiunta di [NonSerialized] anche quando la classe stessa non è Serializable?

La classe non è sigillato, quindi un'altra classe può ereditare da quell'oggetto. Quella classe potrebbe essere contrassegnato come serializzabile, e poi l'attributo NotSerializable entrerebbe in gioco. (Anche se, come sottolineato non per soci privati).

Ricordate è possibile controllare gli attributi dalla riflessione troppo. Esso non può essere utilizzato dal runtime per controllare ciò che dovrebbe e non dovrebbe essere serializzato, potrebbe essere utilizzato come marker per qualcosa di diverso nel trattare programma con una sorta di serializzazione personalizzata (Non sto dicendo che questa è una buona idea in il minimo).

riesco a pensare a due motivi:

  1. Si potrebbe essere di vitale importanza che il campo non viene serializzato. Quindi se in futuro la classe è fatto serialisable, questo non introdurrà un problema di bug, l'inefficienza o la sicurezza, perché senza di essa segna il serialisable classe sarà anche farlo per il campo.

  2. Si potrebbe fare una sorta di utilizzo personalizzato dell'attributo

Nel caso 2 sarà chiaro da altre parti del codice che questo è ciò che sta accadendo. Il numero 1 è buona pratica però.

Caso 1 è una buona pratica, può essere la pena di bilanciamento YAGNI ( "you are not gonna need it" - Non fare il lavoro "nel caso in cui ce n'è bisogno dopo"), con il considerare "va bene, ma se lo faccio bisogno in un secondo momento, sarà un disastro se manca qualcuno che questo campo è un'eccezione.

Così, mentre non ha alcun effetto qui, è sicuramente una buona pratica per gli scenari in cui si comincia ad avere un effetto.

Edit: Un'altra possibilità è che è cruft da una versione precedente in cui era davvero serialisable o l'autore è stato in due menti al momento e non è mai stato del tutto "finito" (è il codice mai del tutto finito di lavorare?). Solo perché qualcosa è in codice, non significa che doveva essere così. Eppure, se è davvero importante che qualcosa non essere serializzato, ho ancora dire che è buona pratica per contrassegnare questo per il motivo di cui sopra.

MSDN SerializeAttribute stati che "Applicare l'attributo SerializableAttribute a un tipo per indicare che le istanze di questo tipo possono essere serializzati." questo significa che senza di essa, la classe non può essere serializzato. Credo di aver tentato questo e il serialize un'eccezione se si cerca su un tipo NonSerializable.

Sono d'accordo con Greg, MSDN afferma che in un modo simile, citando i riferimenti è una buona idea ..

"Per impostazione predefinita, le classi ei loro membri sono non serializzabile. L'attributo NonSerializedAttribute è necessaria solo se un membro di una classe serializzabile non deve essere serializzato."

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top