Compartir a través de


Serialización básica

La forma más sencilla de hacer que una clase sea serializable consiste en marcarla con el atributo Serializable como se indica a continuación.

[Serializable]
public class MyObject {
  public int n1 = 0;
  public int n2 = 0;
  public String str = null;
}

En el siguiente ejemplo de código se muestra cómo serializar una instancia de esta clase en un archivo.

MyObject obj = new MyObject();
obj.n1 = 1;
obj.n2 = 24;
obj.str = "Some String";
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("MyFile.bin", FileMode.Create, FileAccess.Write, FileShare.None);
formatter.Serialize(stream, obj);
stream.Close();

Este ejemplo utiliza un formateador binario para realizar la serialización. Todo lo que necesita es crear una instancia de la secuencia y el formateador que desee utilizar y, a continuación, llamar al método Serialize en el formateador. La secuencia y el objeto que se va a serializar se proporcionan a esta llamada como parámetros. Aunque no se demuestra explícitamente en el ejemplo, se serializarán todas las variables miembro de una clase, incluso las variables marcadas como privadas. En este aspecto, la serialización binaria es diferente de la clase XMLSerializer, que solamente serializa campos públicos. Para obtener información sobre la forma de excluir variables miembro de la serialización binaria, vea Serialización selectiva.

Igual de sencillo resulta restaurar el objeto a su estado anterior. En primer lugar, cree una secuencia para leer y un formateador y, a continuación, indique el formateador que deserialice el objeto. En el siguiente ejemplo de código se muestra cómo hacerlo.

IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("MyFile.bin", FileMode.Open, FileAccess.Read, FileShare.Read);
MyObject obj = (MyObject) formatter.Deserialize(stream);
stream.Close();

// Here's the proof.
Console.WriteLine("n1: {0}", obj.n1);
Console.WriteLine("n2: {0}", obj.n2);
Console.WriteLine("str: {0}", obj.str);

El formateador BinaryFormatter utilizado antes resulta muy eficaz y crea una secuencia de bytes compacta. Todos los objetos serializados con este formateador también se pueden deserializar con él, por lo que se convierte en una herramienta ideal para serializar objetos que después se deserializarán en .NET Framework. Es importante tener en cuenta que, durante la deserialización de un objeto, nunca se llama a ningún constructor. Esta restricción se ha implementado por motivos de rendimiento. Sin embargo, esto infringe algunos de los contratos usuales que el motor de tiempo de ejecución tiene con el escritor del objeto y los programadores deben asegurarse de que comprenden las implicaciones que tiene marcar un objeto como serializable.

Si la portabilidad es un requisito, utilice SoapFormatter en su lugar. Basta con reemplazar el formateador BinaryFormatter en el código anterior por SoapFormatter y llamar a Serialize y Deserialize igual que anteriormente. Este formateador produce el siguiente resultado para el ejemplo utilizado antes.

<SOAP-ENV:Envelope
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
  xmlns:SOAP- ENC="https://schemas.xmlsoap.org/soap/encoding/"
  xmlns:SOAP- ENV="https://schemas.xmlsoap.org/soap/envelope/"
  SOAP-ENV:encodingStyle=
  "https://schemas.microsoft.com/soap/encoding/clr/1.0"
  "https://schemas.xmlsoap.org/soap/encoding/"
  xmlns:a1="https://schemas.microsoft.com/clr/assem/ToFile">

  <SOAP-ENV:Body>
    <a1:MyObject id="ref-1">
      <n1>1</n1>
      <n2>24</n2>
      <str id="ref-3">Some String</str>
    </a1:MyObject>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Es importante tener en cuenta que el atributo Serializable no se puede heredar. Si deriva una nueva clase de MyObject, la nueva clase debe marcarse también con el atributo; de lo contrario, no se podrá serializar. Por ejemplo, si intenta serializar una instancia de la clase siguiente, obtendrá la excepción SerializationException, que le informa de que el tipo MyStuff no está marcado como serializable.

public class MyStuff : MyObject 
{
  public int n3;
}

Utilizar el atributo Serializable es cómodo, pero presenta limitaciones como se demostró anteriormente. Consulte las instrucciones de serialización para obtener información acerca de cuándo marcar una clase para serialización; la serialización no se puede agregar a una clase después de compilarla.

Vea también

Otros recursos

Serialización binaria
Objetos remotos
Serialización XML y SOAP