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

Respuestas:

368

¿Qué es?

Cuando crea un objeto en una aplicación de marco .Net, no necesita pensar 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, debe pensar 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, así como intercambio de datos. A través de la serialización, un desarrollador puede realizar acciones como enviar el objeto a una aplicación remota a través de 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 el usuario específico información en todas las aplicaciones.

Aplicar SerializableAttributea un tipo para indicar que las instancias de este tipo se pueden serializar. Aplique SerializableAttributeincluso si la clase también implementa la ISerializableinterfaz para controlar el proceso de serialización.

Todos los campos públicos y privados en un tipo marcado por SerializableAttributese serializan de manera predeterminada, a menos que el tipo implemente la ISerializableinterfaz para anular el proceso de serialización. El proceso de serialización predeterminado 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 particular y no se puede reconstituir significativamente en un entorno diferente, entonces es posible que desee aplicar NonSerializedAttributea 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 las transferencias y problemas de almacenamiento. Por lo tanto, puede optar por excluir una porción innecesaria de datos al serializar.

CharithJ
fuente
1
@dwbartz Su pregunta se responde aquí enlace
jayasurya_j
2
Buena explicación, sería bueno agregar esto al atributo en MSDN =)
Martea
@jayasurya_j Lástima que la respuesta aceptada no hable mucho sobre las partes privadas
Alexander
1
Buena explicación
Zakir HC
42

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

  • Guardar el estado del objeto utilizando la serialización binaria; puede 'guardar' fácilmente instancias de objetos completos en su aplicación en un archivo o flujo de red y luego recrearlos deserializando: consulte la BinaryFormatterclase en System.Runtime.Serialization.Formatters.Binary
  • Escribir clases cuyas instancias de objeto se pueden almacenar en el portapapeles utilizando Clipboard.SetData(): las clases no serializables no se pueden colocar en el 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.

Bradley Smith
fuente
42

Dado que la pregunta original era sobre el 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.

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

A menos que tenga la intención de 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.

BLaminack
fuente
16
"No tiene NADA que ver con la serialización XML o JSON" - ¡GRACIAS! Finalmente, una explicación de por qué felizmente puedo serializar cualquier clase a XML con o sin este atributo
userSteve
1
¿Tienes una fuente para esto?
Michiel van Oosterhout
"Los serializadores XML y JSON ni siquiera son conscientes de su existencia". No se sobre eso. Cuando JSON formateó una clase a través de WCF, los nombres de propiedad salieron con un guión bajo anterior si la clase era Serializable, y sin cuándo se eliminó el atributo. Entonces alguna interferencia es posible.
Jens
@Jens, si entendí correctamente, a JSON.net no le importa un poco, pero asp.net cambia un poco este comportamiento. Creo que puede evitar esto con los atributos JsonObject / JsonProperty.
Base
29

La 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.

ingrese la descripción de la imagen aquí

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

Detalles en msdn.

Mahbubur Rahman
fuente
14

Publicación por entregas

La serialización es el proceso de convertir un objeto o un conjunto de gráficos de objetos en una secuencia, es una matriz de bytes en el caso de la serialización binaria

Usos de serialización

  1. Para guardar el estado de un objeto en un archivo, base de datos, etc. y usarlo 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 respaldo mientras trabaja en el objeto principal.
  4. Se puede copiar fácilmente un conjunto de objetos en el 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 el serializable de un objeto [No serializado ] -> Se usa cuando no queremos serializar el campo de un objeto. [OnSerializing] -> Se usa cuando queremos realizar alguna acción mientras se serializa un objeto [OnSerialized] -> Se usa cuando queremos realizar alguna acción después de serializar un objeto en la secuencia.

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();
        }

    }
Sheo Dayal Singh
fuente