¿Cuál es la diferencia entre usar el atributo Serializable e implementar ISerializable?

¿Cuál es la diferencia entre usar el atributo Serializable e implementar la interfaz ISerializable ?

Cuando utiliza el atributo SerializableAttribute , está colocando un atributo en un campo en tiempo de comstackción de tal forma que, cuando esté en tiempo de ejecución, las instalaciones de serialización sabrán qué serializar basándose en los atributos mediante la reflexión sobre la clase / módulo / tipo de assembly

 [Serializable] public class MyFoo { … } 

Lo anterior indica que el servicio de serialización debe serializar toda la clase MyFoo , mientras que:

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

Usando el atributo puede seleccionar selectivamente los campos que se deben serializar.

Cuando implementa la interfaz ISerializable , la serialización se ISerializable efectiva con una versión personalizada, anulando GetObjectData y SetObjectData (y al proporcionar 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.

Vea también este ejemplo de una serialización personalizada aquí en StackOverflow . Muestra cómo mantener la serialización compatible con versiones anteriores de los datos serializados.

Espero que esto ayude.

SerializableAttribute indica al marco que realice el proceso de serialización predeterminado. Si necesita más control, puede implementar la interfaz ISerializable . 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.

La interfaz ISerializable permite implementar una serialización personalizada distinta de la predeterminada. Cuando implementa la interfaz ISerializable , debe sobrescribir el método GetObjectData siguiente manera

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

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

Heredar de 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.