¿Qué es y cuándo debería usarlo?

Descubrí que algunas clases usan el atributo [Serializable] .

  • ¿Qué es?
  • ¿Cuándo debería usarlo?
  • ¿Qué tipo de beneficios obtendré?

¿Qué es?

Cuando crea un objeto en una aplicación .Net Framework, no necesita pensar cómo se almacenan los datos en la memoria. Porque .Net Framework se ocupa de eso por usted. Sin embargo, si desea almacenar el contenido de un objeto en un archivo, enviar un objeto a otro proceso o transmitirlo a través de la red, debe pensar en cómo se representa el objeto, ya que tendrá que convertirlo a un formato diferente. . Esta conversión se llama SERIALIZACIÓN.

Usos para la serialización

La serialización le permite al desarrollador guardar el estado de un objeto y recrearlo según sea necesario, proporcionando almacenamiento de objetos y el intercambio de datos. A través de la serialización, un desarrollador puede realizar acciones como enviar el objeto a una aplicación remota por medio de un servicio web, pasar un objeto de un dominio a otro, pasar un objeto a través de un cortafuegos como cadena XML o mantener la seguridad o el usuario específico información en todas las aplicaciones.

Aplique SerializableAttribute a un tipo para indicar que las instancias de este tipo se pueden serializar. Aplique SerializableAttribute incluso si la clase también implementa la interfaz ISerializable para controlar el proceso de serialización.

Todos los campos públicos y privados de un tipo que están marcados por SerializableAttribute se serializan de manera predeterminada, a menos que el tipo implemente la interfaz ISerializable para anular el proceso de serialización. El proceso de serialización predeterminado excluye los campos que están marcados con NonSerializedAttribute . Si un campo de tipo serializable contiene un puntero, un identificador o alguna otra estructura de datos que sea específica de un entorno particular y no se pueda reconstituir de manera significativa en un entorno diferente, entonces puede aplicar NonSerializedAttribute a ese campo.

Ver MSDN para más detalles.

Editar 1

Cualquier razón para no marcar algo como serializable

Al transferir o guardar datos, debe enviar o guardar solo los datos requeridos. Por lo tanto, habrá menos retrasos en la transferencia y problemas de almacenamiento. Por lo tanto, puede optar por excluir una cantidad innecesaria de datos al serializar.

Algunos usos prácticos para el atributo [Serializable] :

  • Guardar el estado del objeto usando la serialización binaria; puede ‘guardar’ fácilmente instancias de objetos completos en su aplicación en un archivo o secuencia de red y luego volver a BinaryFormatter deserializando; consulte la clase BinaryFormatter en System.Runtime.Serialization.Formatters.Binary
  • Escribir clases cuyas instancias de objeto se pueden almacenar en el portapapeles utilizando Clipboard.SetData() – las clases no utilizables no se pueden colocar en el portapapeles.
  • Clases de escritura que son compatibles con .NET Remoting; en general, cualquier instancia de clase que pase entre los dominios de la aplicación (excepto los que se extienden desde MarshalByRefObject ) debe ser serializable.

Estos son los casos de uso más comunes que he encontrado.

Serialización es el proceso de convertir un objeto en una secuencia de bytes para almacenar el objeto o transmitirlo a la memoria, una base de datos o un archivo.

Cómo funciona la serialización

Esta ilustración muestra el proceso general de serialización.

enter image description here

El objeto se serializa a una secuencia, que transporta no solo los datos, sino también la información sobre el tipo del objeto, como su versión, cultura y nombre del ensamblado. Desde esa secuencia, puede almacenarse en una base de datos, un archivo o memoria.

Detalles en msdn.

Aquí hay un breve ejemplo de cómo funciona la serialización. También estaba aprendiendo sobre lo mismo y encontré dos enlaces útiles. Qué es la serialización y cómo se puede hacer en .NET .

Un progtwig de muestra que explica la serialización

Si no entiende el progtwig anterior, aquí se brinda un progtwig muy simple con explicación.

Publicación por entregas

La serialización es el proceso de convertir un objeto o un conjunto de objetos en un flujo, es un conjunto de bytes en el caso de la serialización binaria.

Usos de la serialización

  1. Para guardar el estado de un objeto en un archivo, base de datos, etc. y utilizarlo más tarde.
  2. Para enviar un objeto de un proceso a otro (App Domain) en la misma máquina y también enviarlo por cable a un proceso que se ejecuta en otra máquina.
  3. Para crear un clon del objeto original como una copia de seguridad mientras se trabaja en el objeto principal.
  4. Un conjunto de objetos se puede copiar fácilmente al portapapeles del sistema y luego pegarlo en la misma u otra aplicación

A continuación se muestran algunos atributos personalizados útiles que se utilizan durante la serialización de un objeto

[Serializable] -> Se usa cuando marcamos un objeto serializable [NonSerialized] -> Se usa cuando no queremos serializar el campo de un objeto. [OnSerializing] -> Se usa cuando queremos realizar alguna acción mientras serializamos un objeto [OnSerialized] -> Se usa cuando queremos realizar alguna acción después de serializar un objeto en la transmisión.

A continuación está el ejemplo de serialización

 [Serializable] internal class DemoForSerializable { internal string Fname = string.Empty; internal string Lname = string.Empty; internal Stream SerializeToMS(DemoForSerializable demo) { DemoForSerializable objSer = new DemoForSerializable(); MemoryStream ms = new MemoryStream(); BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(ms, objSer); return ms; } [OnSerializing] private void OnSerializing(StreamingContext context) { Fname = "sheo"; Lname = "Dayal"; } [OnSerialized] private void OnSerialized(StreamingContext context) { // Do some work after serialized object } } 

Aquí está el código de llamada

 class Program { string fname = string.Empty; string Lname = string.Empty; static void Main(string[] args) { DemoForSerializable demo = new DemoForSerializable(); Stream ms = demo.SerializeToMS(demo); ms.Position = 0; DemoForSerializable demo1 = new BinaryFormatter().Deserialize(ms) as DemoForSerializable; Console.WriteLine(demo1.Fname); Console.WriteLine(demo1.Lname); Console.ReadLine(); } } 

Dado que la pregunta original era sobre SerializableAttribute, debe tenerse en cuenta que este atributo solo se aplica cuando se utiliza BinaryFormatter o SoapFormatter.

Es un poco confuso, a menos que realmente preste atención a los detalles, en cuanto a cuándo usarlo y cuál es su propósito real.

No tiene NADA que ver con la serialización XML o JSON.

Usados ​​con SerializableAttribute son la interfaz ISerializable y la clase SerializationInfo. Estos también se usan solo con BinaryFormatter o SoapFormatter.

A menos que intente serializar su clase usando Binary o Soap, no se moleste en marcar su clase como [Serializable]. Los serializadores XML y JSON ni siquiera son conscientes de su existencia.