¿Cuál es la diferencia entre usar el atributo Serializable y la implementación de ISerializable?
-
23-09-2019 - |
Pregunta
¿Cuál es la diferencia entre usar el atributo Serializable
e implementación de la interfaz ISerializable
?
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 (y proporcionando un constructor de la forma SetObjectData
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.