¿Cuál es la diferencia entre usar el atributo Serializable
e implementar la interfaz ISerializable
?¿Cuál es la diferencia entre usar el atributo Serializable e implementar ISerializable?
Respuesta
Cuando se utiliza la SerializableAttribute
atributo que está poniendo un atributo en un campo en tiempo de compilación de tal manera que cuando al Run- tiempo, las instalaciones de serialización sabrán qué serializar en función de los atributos mediante la reflexión sobre el tipo de clase/módulo/ensamblaje.
[Serializable]
public class MyFoo { … }
Lo anterior indica que la instalación de serialización deben serializar toda la clase MyFoo
, 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
interface, la serialización efectivamente consigue que se modifique con una versión personalizada, anulando GetObjectData
y
(y proporcionando un constructor de la forma SetObjectData
MyFoo(SerializationInfo info, StreamingContext context)
), habría un grado de control sobre la serialización de los datos.
Véase también this example of a custom serialization here on StackOverflow. Muestra cómo mantener la serialización compatible con versiones anteriores de los datos serializados.
Espero que esto ayude.
¿En qué versión de .NET está bien agregar el atributo 'Serializable' a una propiedad? MSDN dice que solo se puede aplicar a clases, estructuras, enumeraciones y delegados. – hangy
Ninguno. El atributo serializable no se puede aplicar a las propiedades, solo a las declaraciones de clase, struct y enum y delegate. –
Es todo lo contrario: cuando la clase está decorada con 'SerializableAttribute', un miembro se puede marcar con' NonSerializedAttribute' para omitirlo, como dicen varias personas (y MSDN), cuando reconstruir un determinado objeto no tiene sentido en un entorno diferente, es sabio no serializarlo ... – nurchi
El SerializableAttribute indica al marco que realice el proceso de serialización predeterminado. Si necesita más control, puede implementar el ISerializable interface. 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.
Si implementa ISerializable, también es habitual (o posiblemente necesario) implementar el constructor de deserialización: protected SomeClass (SerializationInfoInfo, StreamingContext context) – jrista
Tenga en cuenta que todavía tiene que marcar la clase [Serializable] incluso si implementa la interfaz ISerializable. –
ISerialize le obliga a implementar la lógica de serialización manially, mientras que marcando por el atributo Serializable (¿lo decía en serio?) Le dirá al serializador binario que esta clase se puede serializar. Lo hará automáticamente.
sí, eso es lo que quise decir. – SoftwareGeek
Heredar desde 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.
La deserialización se maneja a través del constructor de deserialización. Ver mi comentario sobre la respuesta segfaults. – jrista
La interfaz ISerializable
le permite implementar serialización personalizada que no sea la predeterminada. Cuando se implementa la interfaz ISerializable
, usted tiene que anular GetObjectData
método de la siguiente manera
public void GetObjectData (SerializationInfo serInfo,
StreamingContext streamContext)
{
// Implement custom Serialization
}
- 1. ¿Cuál es la diferencia entre scala @Serializable y Java Serializable?
- 2. ¿Cuál es la diferencia entre compilar e implementar?
- 3. ¿Cuál es la diferencia entre IDREF e IDREFS en XSD?
- 4. ¿Cuál es la diferencia entre IDelegateEvent e IEvent en F #?
- 5. ¿Cuál es la diferencia entre require e include con php?
- 6. ¿Cuál es la diferencia entre Convert.Int32() e Int32.Parse()?
- 7. Cuál es la diferencia entre DetachedCriteria e ICriteria
- 8. ¿Cuál es la diferencia entre int [] [] e int [,]?
- 9. en Java ¿cuál es la diferencia entre, E, T
- 10. Cuál es la diferencia entre 'índice' e 'índice de lista'
- 11. ¿Cuál es la diferencia entre el
- 12. ¿Cuál es la diferencia entre objeto e instancia?
- 13. ¿Cuál es la diferencia entre import java.util. *; e importar java.util.Date; ?
- 14. Localización e internacionalización, ¿cuál es la diferencia?
- 15. ¿cuál es la diferencia entre IVT e IDT?
- 16. Cuál es la diferencia entre Add-PsSnapIn e Import-Module
- 17. diferencia entre el atributo DataContract y el atributo Serializable en .net
- 18. ¿Cuál es la diferencia entre NHibernate e iBATIS.NET?
- 19. ¿Cuál es la diferencia entre PHP require e include?
- 20. ¿Cuál es la diferencia entre Scope_Identity(), Identity(), @@ Identity e Ident_Current()?
- 21. ¿Cuál es la diferencia entre "indefinido" e indefinido?
- 22. ¿Cuál es la diferencia entre IEnumerator e IEnumerable?
- 23. ¿Cuál es la diferencia entre AxInterop e Interop?
- 24. ¿Cuál es la diferencia entre identidad e igualdad en OOP?
- 25. ¿Cuál es la diferencia entre "privado" e "interno protegido"?
- 26. ¿Cuál es la diferencia entre las interfaces IComparable e IEquatable?
- 27. Erlang: ¿cuál es la diferencia entre "include_lib" e "include"?
- 28. ¿cuál es la diferencia entre invalidateList e invalidateDisplayList?
- 29. ¿Cuál es la diferencia entre WAS e IIS?
- 30. ¿Cuál es la diferencia entre "protegido" e "interno protegido"?
Relacionados: http://stackoverflow.com/q/5877808/945456 –