2009-09-22 14 views
6

estaba leyendo el artículo de serialización personalizado en MSDN: http://msdn.microsoft.com/en-us/library/ty01x675%28VS.80%29.aspxOnSerializingAttribute vs ISerializable

Se menciona que hay dos maneras de implementar serialización personalizada:
1, usando OnDeserializedAttribute, OnDeserializingAttribute, OnSerializedAttribute, OnSerializingAttribute
2, implementar ISerializable interfaz

acuerdo Para MSDN, el método n. ° 1 es "la mejor práctica y la más fácil", pero no entiendo cómo son los dos métodos ni siquiera lo mismo. A mi entender, los atributos OnSerializing|OnSerialized|etc le permiten conectar métodos a fases particulares de la serialización, mientras que la interfaz ISerializable le permite modificar directamente lo que entra y sale del SerializationInfo. ¿Es esto correcto?

Para poner mi confusión en contexto, ¿cómo se implementa OnSerializing para serializar el campo de objeto con un nombre diferente? como el siguiente código:

 
public virtual void GetObjectData(SerializationInfo info, StreamingContext context) 
{ 
    info.AddValue("i", n1); 
    info.AddValue("j", n2); 
    info.AddValue("k", str); 
} 

actualización: A pesar de la respuesta de Frederik Gheysels no es completamente correcta (la decoración con Serializable es pre-requisito para ambos OnSerializing/OnDeserializing atributos y la interfaz ISerializable), lo hizo sin embargo señala que OnSerializing/Los atributos OnDeserializing están destinados a ser un suplemento de ISerializable, por lo que estoy aceptando su respuesta en este punto.

Respuesta

4

OnSerializing/OnDeserializing es un complemento de ISerializable o SerializableAttribute.

En otras palabras: OnSerializing/OnDeserializing no es una alternativa para ISerializable o SerializableAttribute.

Estos 2 atributos (OnSerializing/OnDeserializing) le permiten controlar/realizar acciones adicionales cuando un objeto se serializa o se deserializa. Pero, para poder hacer esto, el tipo al que se aplican estos atributos debe ser serializable (y así implementar la interfaz ISerializable, o decorado con el atributo Serializable).

Esto también se dice así en el artículo de MSDN al que se refiere: - OnSerializing y OnDeserializing se utilizan para "corregir" los datos durante y después de la serialización.

Puede probarlo con bastante facilidad. Crear un tipo como este, y tratar de serializarlo:

public class Foo 
{ 
    private int _bar = 5; 

    [OnSerializing] 
    public void OnSerializeFoo(StreamingContext context) 
    { 
     _bar = 10; 
    } 
} 

Tenga en cuenta que el tipo no implementa ISerializable, ni está decorado con la SerializableAttribute. Intente serializar una instancia de ese tipo, y se encontrará con un SerializationException, porque Foo no se puede serializar.

Por lo tanto, puede utilizar estos atributos (OnSerializing, OnDeserializing) para implementar una lógica adicional que debe realizarse cuando una instancia de un cierto tipo se serializa o se deserializa.

+0

También en el artículo de MSDN mencionado, hay una oración que dice ".... Tenga en cuenta, sin embargo, que el método en la sección anterior reemplaza este método para controlar la serialización" al referirse a la interfaz ISerializable.
¿Significa que los atributos OnSerializing/OnDeserializing reemplazarán a los métodos de la interfaz ISerializable? ¿O malinterpreté esta oración? –

Cuestiones relacionadas