Pregunta

¿Cuál es la diferencia entre usar el atributo Serializable e implementación de la interfaz ISerializable?

¿Fue útil?

Solución

Cuando se utiliza la referencia atributo que está poniendo un atributo en un campo en tiempo de compilación de tal manera que cuando en tiempo de ejecución, las instalaciones de números de serie sabrán qué serializar basado en los atributos mediante la realización de reflexión sobre la clase / módulo / tipo de montaje .

[Serializable]
public class MyFoo { … }

Lo anterior indica que la instalación de la serialización deben serializar toda la MyFoo clase, 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 interfaz , la serialización efectivamente se reemplaza con una versión personalizada, reemplazando GetObjectData y SetObjectData (y proporcionando un constructor de la forma MyFoo(SerializationInfo info, StreamingContext context)), habría un grado más fino de control sobre la serialización de los datos.

este ejemplo de una serialización personalizada aquí en StackOverflow . Se muestra como evitar que los compatibles-serialización con diferentes versionings de los datos serializados.

Espero que esto ayude.

Otros consejos

El SerializableAttribute instruye el marco para hacer la serialización por defecto proceso. Si se necesita más control, se puede implementar el ISerializable interfaz . Entonces sería poner el su propio código para serializar el objeto en el método GetObjectData y actualizar el objeto que se pasa SerializationInfo adentro a él.

La interfaz ISerializable le permite implementar costumbre serialización que no sea por defecto. Cuando se implementa la interfaz ISerializable, usted tiene que reemplazar el método GetObjectData de la siguiente manera

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

ISerialize fuerza a implementar la lógica de serialización manially, al marcar por atributo Serializable (no quiere decir que?) Le dirá serializador binario que esta clase se puede serializar. Lo hará automáticamente.

heredando de ISerializable le permite implementar el encargo (de) la serialización. Cuando se utiliza solamente el atributo Serializable, la (de) de serialización puede ser controlada solamente por atributos y es menos flexible.

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