Pregunta

Estoy buscando a través de algún código existente en un proyecto que estoy trabajando, y me encontré con una clase que se implementa como:

public class ThingOne
{
    private int A;

    private int B;

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

¿No debería parecerse más a esto?

[Serializable]
public class ThingOne
{
    private int A;

    private int B;

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

O hay algún beneficio adicional a la adición de [NonSerialized] incluso cuando la clase en sí no es Serializable?

¿Fue útil?

Solución

NonSerialized tendrá ningún efecto cuando no se utiliza Serializable. Por defecto, las clases y sus miembros no son serializable.

La única ventaja de declarar algo NonSerialized cuando la clase no se serializa es bajo las circunstancias que la clase es heredado por un objeto serializado, y luego el miembro heredado será no serializable.

Desde MSDN :

atributo 'NonSerialized' no lo hará afectará a este miembro porque su clase que contiene no se expone como 'Serializable'.

Por defecto, las clases y sus miembros son no-serializable. El atributo NonSerializedAttribute sólo es necesario si un miembro de una clase serializable no debe ser serializado.

Otros consejos

O hay algún beneficio adicional a la adición de [NonSerialized] incluso cuando la clase en sí no es Serializable?

La clase no está sellado, por lo que otra clase puede heredar de ese objeto. Esa clase podría ser marcado como serializable, y luego el atributo NotSerializable entraría en juego. (Aunque como se ha señalado no para miembros privados).

Recuerde que puede comprobar atributos por reflexión también. No se puede utilizar el tiempo de ejecución para comprobar lo que debe y no debe ser serializado, que podría ser utilizado como un marcador para otra cosa en el programa de negociación con algún tipo de serialización personalizada (no estoy diciendo que esto es una buena idea en El menos).

Me puede pensar en dos razones:

  1. Podría ser de vital importancia que el campo no es de serie. Por tanto, si en el futuro la clase se hace serialisable, esto no va a introducir un número de errores, la ineficiencia o la seguridad, ya que sin ella marcando el serialisable clase también lo hará para el campo.

  2. Podrían estar haciendo algún tipo de uso a medida del atributo

En el caso 2 que va a ser claro a partir del código que esto es lo que está pasando en otros lugares. El número 1 es buena práctica, sin embargo.

El caso 1 es una buena práctica, puede ser digno de equilibrio YAGNI ( "No vas a NECESITE" - no hacer el trabajo "en caso de que se necesite más tarde") con la consideración de "bien, pero si lo hago necesidad más tarde, que va a ser un desastre si falla alguien que este campo es una excepción.

Así que, aunque no tiene ningún efecto aquí, es definitivamente una buena práctica para los escenarios en los que comienza a tener un efecto.

Edit: Otra posibilidad es que se Cruft de una versión anterior donde estaba de hecho serialisable o el autor estaba en dos mentes en el momento y nunca fue del todo "acabada" (código está siempre totalmente terminado de trabajar?). El hecho de que algo está en código, no quiere decir que estaba destinado a ser de esa manera. Aún así, si es realmente importante que algo no puede serializar, sigo diciendo que es una buena práctica para marcar esto por la razón dada anteriormente.

MSDN SerializeAttribute estados que "Aplicar el atributo SerializableAttribute a un tipo para indicar que los casos de este tipo se pueden serializar". esto implica que, sin ella, la clase no puede ser serializado. Creo que he intentado esto y la serialización a lanzar una excepción si se intenta en un tipo NonSerializable.

Estoy de acuerdo con Greg, MSDN indica que de una manera similar, citando referencias es una buena idea ..

"Por defecto, las clases y sus miembros son no-serializable. El atributo NonSerializedAttribute sólo es necesario si un miembro de una clase serializable no debe ser serializado."

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top