c# - ¿Cuál es la diferencia entre usar el atributo Serializable e implementar ISerializable?
inheritance attributes (5)
¿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 compilació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 montaje
[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 (y al proporcionar 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.
Vea también este ejemplo de una serialización personalizada aquí en . Muestra cómo mantener la serialización compatible con versiones anteriores de los datos serializados.
Espero que esto ayude.
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.
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.
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
}
SerializableAttribute indica al marco que realice el proceso de serialización predeterminado. Si necesita más control, puede implementar la GetObjectData . 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.