una texto serialize serializar serializacion property programacion objeto nonserialized newtonsoft net lineas deserializacion clase binaria atributo archivo agregar c# .net serialization nonserializedattribute

c# - texto - ¿Por qué necesito "field:" en mi declaración de atributo "[field: NonSerialized]"?



serialize object c# (4)

No puedo encontrar "campo" como una palabra clave de C # en cualquier lugar. ¿Alguien sabe los antecedentes sobre esto?


El atributo no serializado solo es aplicable a los campos, puede usarlo de la siguiente manera:

[NonSerialized] public string myString;


El compilador de C # generalmente no tiene problemas para averiguar a qué parte de una declaración se aplica el atributo. Puedo pensar en tres casos en los que podrías usarlo:

  1. Atributos que se aplican al ensamblaje. Muy visible en AssemblyInfo.cs
  2. Un atributo aplicado al valor de retorno de una declaración P / Invoke, [return: MarshalAs]
  3. Que el atributo se aplique a la variable de respaldo de una propiedad o evento sin accesores. Tu caso.

Esto es necesario, por ejemplo, si está marcando un evento como no serializable. Especifica el destino al que se aplica el atributo.

Es parte de la sintaxis de destino del atributo. De la specification :

attribute-target: field event method param property return type

Consulte también la documentación de NonSerializedAttribute :

Para aplicar la clase NonSerializedAttribute a un evento, establezca la ubicación del atributo en el campo, como se muestra en el siguiente código C #.

[field:NonSerializedAttribute()]

public event ChangedEventHandler Changed;


Esto tiene la intención de permitirle establecer un atributo no serializado en los campos, esto es útil para serializar eventos.

Por ejemplo, esto le daría un error de compilación.

[NonSerialized] public event SomeEventHandler SomeEvent;

Para arreglar esto tienes que usar el field:

[field:NonSerialized] public event SomeEventHandler SomeEvent;

Más sobre esto aquí - Delegados y serialización