2010-03-02 17 views

Respuesta

38

Cuando se utiliza la SerializableAttribute atributo que está poniendo un atributo en un campo en tiempo de compilación de tal manera que cuando al Run- tiempo, las instalaciones de serialización sabrán qué serializar en función de los atributos mediante la reflexión sobre el tipo de clase/módulo/ensamblaje.

[Serializable] 
public class MyFoo { … } 

Lo anterior indica que la instalación de serialización deben serializar toda la clase MyFoo, mientras que:

public class MyFoo 
{ 
    private int bar; 

    [Serializable] 
    public int WhatBar 
    { 
     get { return this.bar; } 
    } 
} 

Usando el atributo se puede elegir selectivamente qué campos necesita ser serializado.

Cuando se implementa la ISerializable interface, la serialización efectivamente consigue que se modifique con una versión personalizada, anulando GetObjectData y SetObjectData (y proporcionando un constructor de la forma MyFoo(SerializationInfo info, StreamingContext context)), habría un grado de control sobre la serialización de los datos.

Véase también this example of a custom serialization here on StackOverflow. Muestra cómo mantener la serialización compatible con versiones anteriores de los datos serializados.

Espero que esto ayude.

+11

¿En qué versión de .NET está bien agregar el atributo 'Serializable' a una propiedad? MSDN dice que solo se puede aplicar a clases, estructuras, enumeraciones y delegados. – hangy

+5

Ninguno. El atributo serializable no se puede aplicar a las propiedades, solo a las declaraciones de clase, struct y enum y delegate. –

+3

Es todo lo contrario: cuando la clase está decorada con 'SerializableAttribute', un miembro se puede marcar con' NonSerializedAttribute' para omitirlo, como dicen varias personas (y MSDN), cuando reconstruir un determinado objeto no tiene sentido en un entorno diferente, es sabio no serializarlo ... – nurchi

19

El SerializableAttribute indica al marco que realice el proceso de serialización predeterminado. Si necesita más control, puede implementar el ISerializable interface. Luego, debe colocar su propio código para serializar el objeto en el método GetObjectData y actualizar el objeto SerializationInfo que se le pasa.

+3

Si implementa ISerializable, también es habitual (o posiblemente necesario) implementar el constructor de deserialización: protected SomeClass (SerializationInfoInfo, StreamingContext context) – jrista

+16

Tenga en cuenta que todavía tiene que marcar la clase [Serializable] incluso si implementa la interfaz ISerializable. –

1

ISerialize le obliga a implementar la lógica de serialización manially, mientras que marcando por el atributo Serializable (¿lo decía en serio?) Le dirá al serializador binario que esta clase se puede serializar. Lo hará automáticamente.

+0

sí, eso es lo que quise decir. – SoftwareGeek

0

Heredar desde ISerializable le permite implementar de forma personalizada la (de) serialización. Cuando se usa solo el atributo Serializable, la (de) serialización puede controlarse solo por atributos y es menos flexible.

+0

La deserialización se maneja a través del constructor de deserialización. Ver mi comentario sobre la respuesta segfaults. – jrista

3

La interfaz ISerializable le permite implementar serialización personalizada que no sea la predeterminada. Cuando se implementa la interfaz ISerializable, usted tiene que anular GetObjectData método de la siguiente manera

public void GetObjectData (SerializationInfo serInfo, 
            StreamingContext streamContext) 
{ 
    // Implement custom Serialization 
} 
Cuestiones relacionadas