Serializar / deserializar objetos en C#

Cómo serializar y deserializar objetos con C#


Serializar / deserializar objetos en C#

Los conceptos de serialización y deserialización son bastante comunes en.NET y hacen referencia a la posibilidad de grabar y cargar objetos fácilmente utilizando ciertas características de.NET.

Para utilizar la serialización en.NET lo primero que debemos hacer es marcar nuestra clase como Serializable utilizando el atributo Serializable

[Serializable]
public class MyClass
{ 
	public int Width { get; set; }
	
	public int Height { get; set; }

	[NonSerialized] 
	public int Area 
	{ get { return Width * Height; }
	}
}
	

En el ejemplo anterior, tenemos una clase que hemos llamado MyClass y la hemos marcado como Serializable , por tanto todas sus propiedades se almacenarán cuando serialicemos objetos de este tipo. En el mismo ejemplo hemos marcado una de las propiedades con el atributo NonSerialized lo que indica que no se debe almacenar este valor.

Una vez hemos marcado nuestra clase como Serializable lo único que nos queda es almacenar los objetos en archivos o memoria.

El proceso es muy sencillo. Por ejemplo, para grabarlo en un archivo podemos utilizar el siguiente código:

public void SerializeObject(object objObject, string strFileName)
{ byte[] arrBytes = new byte[MAX_LENGTH];
	
		// Serializamos el objeto en un stream de memoria
			using (Stream stmMemory = new MemoryStream(arrBytes, true))
				{ IFormatter objFormatter = new BinaryFormatter();
				
						// Serializamos el objeto en memoria
							objFormatter.Serialize(stmMemory, objObject);
						// Cerramos el stream en memoria
							stmMemory.Close();
				}
		// Grabamos los datos en un archivo
			using (Stream stmFile = new FileStream(strFileName, FileMode.Create, FileAccess.Write, FileShare.ReadWrite))
				{ // Grabamos los datos
						stmFile.Write(arrBytes, 0, arrBytes.Length);
					// Cerramos el archivo
						stream.Close();
				}
}
	

En este caso hemos utilizado, aparte del stream sobre el archivo un stream en memoria simplemente por demostrar lo sencillo que es serializar un objeto a la memoria.

El proceso inverso utilizado para cargar un objeto (deserializarlo) es igualmente simple:

public object DeserializaObject(string strFileName)
{ object objTarget = null;
	byte [] arrBytes = new byte[MAX_LENGTH];
		
		// Deserializa el objeto del archivo en un array en memoria
			using (Stream stmFile = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
				{ // Carga los datos sobre el array de bytes
						stmFile.Read(arrBytes, 0, arrBytes.Length);
					// Cierra el archivo
						stmFile.Close();
				}
		// Convierte el array de bytes en el objeto inicial
			using (Stream stmMemory = new MemoryStream(arrBytes, true))
				{ IFormatter objFormatter = new BinaryFormatter();

						// Deserializa el objet
							objTarget = (object) formatter.Deserialize(stmMemory);
						// Cierra el stream
							stmMemory.Close();
				}
		// Devuelve el objeto leído
			return objTarget
	}
	

Páginas relacionadas