Mes: julio 2012

Serializar y deserializar en .NET con C#

NOTA: Esta es una entrada extraída de mi anterior blog (de hecho la primera que he escrito), la he decidido publicar porque me consta que ha sido útil.

Muchas veces surge la necesidad de almacenar objetos en ficheros, en memoria, como cadena de caracteres, en una base de datos, etc. Para ello .NET nos facilita la vida primero debemos marcar la clase como “Serializable” y posteriormente proceder a realizar la serialización.

Veremos un ejemplo sencillo:

Serializar un objeto en memoria:

Primero definimos un array de bytes con una longitud estimada (superior a la que va a tener el objeto en cuestión).

byte[] flujosBytes = new byte[LONGITUD];



A continuación, se especifica el formato de la serialización y una nueva instancia de la clase donde lo vamos a serializar (en memoria) pasando por parámetro el array que acabamos de crear.

 

IFormatter formatter = new BinaryFormatter();

Stream stream = new MemoryStream(flujosBytes, true);

Se ejecuta el método Serialize con el flujo y el objeto a serializar (recordad que debe estar marcado como serializable)  y finalmente se cierra el flujo.

formatter.Serialize(stream, objeto);

stream.Close();

Ya tenemos el objeto en forma de array de bytes,  a partir de aquí guardarlo por ejemplo, en un fichero es trivial:

Stream stream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.ReadWrite);

stream.Write(flujo, 0,flujo.Length);

stream.Close();

Bien,  ya tenemos el objeto serializado y almacenado en un fichero, pero, ¿cómo desserializamos? Pues muy sencillo:

Primero -y siguiendo con el ejemplo- se debe rescatar el flujo de bytes del fichero que acabamos de crear:

Stream stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);

byte[] flujo = new byte[LONGITUD];

stream.Read(flujo, 0, flujo.Length);

stream.Close();

Volvemos a tener el flujo del principio, ahora procedemos a convertir el flujo de bytes al objeto inicial:

IFormatter formatter = new BinaryFormatter();

Stream stream = new MemoryStream(flujo, true);

object objectD = (object)formatter.Deserialize(stream);

stream.Close();

[IA Aprendizaje] Probabilidad: El método clásico I.

 

Vale, no es el tema más adecuado para escribir en un blog de programación pero si pensamos en aplicaciones en la IA, que a su vez se tendrán que representar programáticamente, seguro que ya nos parece algo más acertado. De todas formas, la intención no es perdernos en formalidades matemáticas, sino intentar desde el principio buscar un enfoque práctico. Intentaré partir las entradas y hacerlas lo más amenas posible.

Si lanzamos un dado al aire, podemos preguntarnos, por ejemplo, ¿cuál es la probabilidad de sacar un 2? o ¿cuál es la probabilidad de sacar un número impar?

Cuando lanzamos un dado de seis caras podremos obtener, evidentemente, seis resultados distintos. El conjunto de estos posibles resultados ({1,2,3,4,5,6}) se denomina espacio muestral o número de casos posibles. Un suceso o número de casos favorables es un subconjunto de nuestro espacio muestral, para nuestro caso particular:

¿Cuál es la probabilidad de sacar un 2?

A={2}

¿Cuál es la probabilidad de sacar un número impar?
B={1,3,5}


Se pueden realizar distintas operaciones con los sucesos, un poco más abajo dejo una hoja a modo de resumen.

Por otra parte, la regla de Laplace nos dice que:


 

Para nuestros casos:
P(A)=1/6=0.1667 Es decir, el 16% de las veces sacaremos un 2.
P(B)=3/6=0.5 La mitad de la veces sacaremos un número par.

Se puede observar que el valor de ambos sucesos está entre 0 y 1 y siempre será así, ya que cuanto más próximo a 1 quiere decir que tenemos más casos favorables.

A continuación os dejo una captura con algunas leyes básicas: