¿Qué es [Serializable] y cuándo debo usarlo?


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

  • ¿Qué es?
  • ¿Cuándo debo usarlo?
  • ¿Qué tipos de beneficios obtendré?
Author: Devid, 2011-05-04

6 answers

¿Qué es?

Cuando crea un objeto en una aplicación.Net framework, no necesita pensar en cómo se almacenan los datos en la memoria. Porque. Net Framework se encarga 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, tiene que pensar en cómo se representa el objeto porque necesitará convertirlo a un formato diferente. Esta conversión se llama SERIALIZACIÓN.

Usos para la Serialización

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

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

Todos los campos públicos y privados en un tipo que están marcados por SerializableAttribute son serializados de forma predeterminada, a menos que el tipo implemente ISerializable interfaz para anular el proceso de serialización. Predeterminado el proceso de serialización excluye los campos marcados con NonSerializedAttribute. Si un campo de tipo serializable contiene un puntero, un identificador o alguna otra estructura de datos que es específica de un entorno en particular y no se puede reconstituir significativamente en un entorno diferente, es posible que desee 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 no incluir fragmentos innecesarios de datos al serializar.

 316
Author: CharithJ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-18 05:36:32

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

  • Guardar el estado del objeto mediante serialización binaria; puede 'guardar' muy fácilmente instancias de objetos enteras en su aplicación en un archivo o flujo de red y luego recrearlas deserializando - consulte la clase BinaryFormatter en System.Ejecución.Serialización.Formateadores.Binario
  • Clases de escritura cuyas instancias de objeto se pueden almacenar en el portapapeles usando Clipboard.SetData() - las clases no serializables no se pueden colocar en portapapeles.
  • Escribir clases que sean compatibles con.NET Remoting; generalmente, cualquier instancia de clase que pase entre dominios de aplicación (excepto aquellos que se extienden desde MarshalByRefObject) debe ser serializable.

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

 33
Author: Bradley Smith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-04 03:57:28

La serialización es el proceso de convertir un objeto en un flujo de bytes para almacenar el objeto o transmitirlo a la memoria, un base de datos, o un archivo.

Cómo Funciona La Serialización

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

introduzca la descripción de la imagen aquí

El objeto se serializa en una secuencia, que lleva no solo los datos, sino información sobre el tipo del objeto, como su versión, cultura y nombre del ensamblado. A partir de ese flujo, se puede almacenar en una base de datos, un archivo o una memoria.

Detalles en msdn.

 20
Author: Mahbubur Rahman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-05 17:49:22

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 programa de ejemplo que explica la serialización

Si no entiende el programa anterior, se da un programa mucho más simple con explicación aquí.

 16
Author: Akshay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-26 21:05:52

Serialización

Serialización es el proceso de convertir un objeto o un conjunto de objetos gráfico en un flujo, es una matriz de bytes en el caso de serialización binaria

Usos de la serialización

  1. Para guardar el estado de un objeto en un archivo, base de datos, etc. y úsalo después.
  2. Para enviar un objeto de un proceso a otro (Dominio de aplicación) en la misma máquina y también enviarlo por cable a un proceso que se ejecuta en otro equipo.
  3. Para crear un clon del objeto original como copia de seguridad mientras se trabaja en el objeto principal.
  4. Un conjunto de objetos puede copiarse fácilmente en el portapapeles del sistema y luego pegarse en la misma o en 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 el serializable de un objeto [No serializado] - > Se usa cuando no lo hacemos desea serializar el campo de un objeto. [Sererializing] - > Se usa cuando queremos realizar alguna acción mientras serializamos un objeto [Sererialized] - > Se usa cuando queremos realizar alguna acción después de serializar un objeto en stream.

A continuación se muestra 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();
        }

    }
 6
Author: Sheo Dayal Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-10 13:10:50

Dado que la pregunta original era sobre SerializableAttribute, debe tenerse en cuenta que este atributo solo se aplica cuando se usa 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.

Se utilizan con SerializableAttribute la interfaz ISerializable y la clase SerializationInfo. Estos son también solo se utiliza con el BinaryFormatter o SoapFormatter.

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

 5
Author: BLaminack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-22 15:36:59