2009-11-13 2 views

risposta

59

Non è supportato per le proprietà autoattive. Devi utilizzare un campo di supporto e impostare NonSerializedAttribute su di esso.

public class ClassWithNonSerializedProperty { 

    [NonSerialized] 
    private object _data; // Backing field of Property Data that is not serialized 

    public object Data{ 
    get { return _data; } 
    set { _data = value; } 
    } 
} 
+0

oppure è possibile utilizzare [field: NonSerialized] direttamente sulla proprietà. – profou

4

Se si esegue la serializzazione su Xml, è possibile utilizzare l'attributo XmlIgnore.

4

Non sono sicuro che sia possibile. Questo MSDN article on SerializableAttribute suggerisce di implementare ISerializable e controllare la serializzazione da soli:

Tutti i campi pubblici e privati ​​in un tipo che sono contrassegnati dal SerializableAttribute vengono serializzati per impostazione predefinita, a meno che il tipo implementa l'interfaccia ISerializable di ignorare il processo di serializzazione .

Oppure passare da una proprietà automatica per quello specifico campo.

8
// This works for the underlying delegate of the `event` add/remove mechanism. 
[field:NonSerialized] 
public event EventHandler SomethingHappened; 

Ma non sembra per le proprietà auto-implementato. Ho pensato che fosse degno di nota perché è utile sapere quando si serializza un oggetto con abbonati di eventi ad esso collegati.

4

Non è possibile per le proprietà implementate automaticamente. Considerare il seguente:

Questo comportamento è "in base alla progettazione". La decisione nel momento in cui sono state implementate le proprietà automatiche era che avrebbero funzionato nel "caso comune" che, tra le altre cose, non significa attributi sul campo generato. L'idea alla base di ciò è mantenerli semplici e non trasformarli lentamente in proprietà complete. Quindi, se è necessario utilizzare l'attributo NonSerialized, le proprietà complete sono la via.

(http://social.msdn.microsoft.com/Forums/en-US/vcsharp2008prerelease/thread/2b6eb489-122a-4418-8759-10808252b195)

3

La soluzione proposta di utilizzare campo di supporto non-serializzato non sembra funzionare correttamente con NET 4.0 (almeno nel caso di serializzazione XML). Il campo infatti non viene serializzato ma la proprietà pubblica che lo usa serializza e quindi sconfigge lo scopo. L'uso della soluzione XmlIgnore aiuta in caso di serializzazione Xml. Disclaimer - Non ho verificato il comportamento di serializzazione binaria.

6

Se si sta serializzando su Json e si utilizza lo Json.NET serializer (che consiglio vivamente poiché ha molto più da offrire rispetto a un certo numero di altri serializzatori sul mercato), è possibile ottenere il risultato desiderato su proprietà utilizzando [JsonIgnore].

Non è necessario creare un campo.

Così il vostro codice sarebbe:

public class ClassName 
{ 
    [JsonIgnore] 
    public object IgnoreMe { get; set; } 

    public object DoNotIgnoreMe { get; set; } 
}