Compartir a través de


Serialización básica

La manera más fácil de hacer una clase serializable es marcarla con el atributo Serializable como sigue.

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

El ejemplo de código siguiente muestra cómo una instancia de esta clase se puede serializar a 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 hacer la serialización. Todo lo que necesita hacer es crear una instancia de la secuencia y el formateador que piensa utilizar y, a continuación, llama al método Serialize en el formateador. La secuencia y el objeto para serializar se proporcionan como parámetros a esta llamada. Aunque no se muestra explícitamente en este ejemplo, todas las variables miembro de una clase serán serializadas, incluso las variables marcadas como privadas. En este aspecto, la serialización binaria difiere de la Clase XMLSerializer, que solo serializa los campos públicos. Para obtener información sobre cómo excluir las variables miembro de la serialización binaria, vea la Serialización Selectiva.

Restaurar el objeto a su estado anterior es así de fácil. Primero, cree una secuencia para leer y un formateador y, a continuación, indica al formateador que deserialice el objeto. El ejemplo de código siguiente muestra cómo se realiza la acción.

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

BinaryFormatter utilizado arriba es muy eficaz y genera una secuencia de bytes compacta. Todos los objetos serializados con este formateador también se pueden deserializar con él, que lo convierte en una herramienta ideal para serializar objetos que se deserializarán en .NET Framework. Es importante tener en cuenta que no se llama a los constructores cuando se deserializa un objeto. Esta restricción se coloca en deserialización por las razones de rendimiento. Sin embargo, esto infringe algunos de los contratos usuales hechos en tiempo de ejecución con la escritura de objeto y los programadores debería asegurarse que entienden las ramificaciones al marcar un objeto como serializable.

Si la portabilidad es un requisito, utilice en su lugar SoapFormatter. Simplemente reemplace BinaryFormatter en el código anterior con SoapFormatter y llame a Serializar y Deserializar como antes. Este formateador genera el resultado siguiente para obtener el ejemplo utilizado anteriormente.

<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 pueda estar heredado. Si deriva una nueva clase de MyObject, la nueva clase también se debe marcar con el atributo o no se puede serializar. Por ejemplo, al intentar serializar una instancia de la clase siguiente, obtendrá SerializationException que lo informa que el tipo MyStuff no se marca como serializable.

public class MyStuff : MyObject 
{
  public int n3;
}

Utilizar el atributo Serializable es conveniente, pero tiene las limitaciones como se ha mostrado anteriormente. Consulte las Instrucciones de la Serialización para obtener información sobre cuando se debe marcar una clase para la serialización; la serialización no se puede agregar a una clase una vez estado compilado.

Vea también

Otros recursos

Serialización binaria
Remote Objects
Serialización de SOAP y XML