<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>DevelopMania</title>
	<atom:link href="http://developmania.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://developmania.wordpress.com</link>
	<description>Desarrollando aplicaciónes Inform@tic@s</description>
	<lastBuildDate>Sat, 07 Jan 2012 17:36:59 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='developmania.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>DevelopMania</title>
		<link>http://developmania.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://developmania.wordpress.com/osd.xml" title="DevelopMania" />
	<atom:link rel='hub' href='http://developmania.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Serializaci&#243;n de datos en C#</title>
		<link>http://developmania.wordpress.com/2009/07/02/serializacion-de-datos-en-c/</link>
		<comments>http://developmania.wordpress.com/2009/07/02/serializacion-de-datos-en-c/#comments</comments>
		<pubDate>Thu, 02 Jul 2009 13:35:59 +0000</pubDate>
		<dc:creator>fzapataramirez</dc:creator>
				<category><![CDATA[Programación(Intermedia)]]></category>
		<category><![CDATA[serializacion]]></category>
		<category><![CDATA[serializacion de datos]]></category>
		<category><![CDATA[serializacion en c#]]></category>

		<guid isPermaLink="false">http://developmania.wordpress.com/2009/07/02/serializacin-de-datos-en-c/</guid>
		<description><![CDATA[Quizás muchos desarrolladores hayan escuchado hablar del termino “serializar la información” y no saber de que se trata. Pues bien, resulta que la serialización de datos no es otra cosa que transformar los datos de tal manera que pueda ser transferida por un canal (Internet, archivo plano, memoria, etc) a otro sistema. En otras palabras, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=developmania.wordpress.com&amp;blog=3736555&amp;post=216&amp;subd=developmania&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p align="justify">Quizás muchos desarrolladores hayan escuchado hablar del termino “serializar la información” y no saber de que se trata. Pues bien, resulta que la serialización de datos no es otra cosa que transformar los datos de tal manera que pueda ser transferida por un canal (Internet, archivo plano, memoria, etc) a otro sistema. En otras palabras, si queremos compartir información de nuestro sistemas con otras aplicaciones o viceversa, tendremos que utilizar serialización de datos.</p>
<p align="justify">De manera nativa, el Framework de .NET nos ofrece la posibilidad de serializar la información en tres formatos: <strong>Binario, Soap, Xml</strong>.</p>
<p>La serialización en formato binario consiste en convertir la información a bytes y se utiliza comúnmente para los escenarios donde la información es transferida por la red hacia un sistema destino, el cual recibe dicha información y realiza el proceso inverso de la serialización = <strong>Deserializacion </strong>para construir el objeto (información) que fue transferido.     <br />La serialización en formato Soap consiste en convertir los datos en un “documento estándar” en el cual se incluirá además de los datos a serializar, una serie de información adicional que será utilizada por el sistemas destino para construir el objeto original. Esta serialización es la que se utiliza en escenarios con Web Services.     <br />Finalmente la serialización en formato Xml, consiste en transformar la información en un documento Xml que será interpretado por el sistema destino.</p>
<p align="justify">Los formatos de serialización Binario y Soap están contenidos en el namespace System.Runtime.Serialization, mientras que el Xml esta en el namespace System.Xml.Serialization.</p>
<p align="justify">Para ejemplificar cada escenario, supóngase que en nuestra aplicación se utiliza una entidad llamada Empleado definida como se muestra a continuación:</p>
<p>public class Empleado    <br />{     <br />&#160;&#160;&#160; private int identificacion;     <br />&#160;&#160;&#160; private string nombre;     <br />&#160;&#160;&#160; private string apellido;     <br />&#160;&#160;&#160; private int edad;     <br />&#160;&#160;&#160; private string telefono;     <br />&#160;&#160;&#160; private DateTime fechaIngreso;     <br />&#160;&#160;&#160; private int diasLaborados; </p>
<p>&#160;&#160;&#160; public int Identificacion    <br />&#160;&#160;&#160; {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; get     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return identificacion;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; set     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; identificacion = value;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }     <br />&#160;&#160;&#160; }     <br />&#160;&#160;&#160; public string Nombre     <br />&#160;&#160;&#160; {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; get { return nombre; }     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; set { nombre = value; }     <br />&#160;&#160;&#160; } </p>
<p>&#160;&#160;&#160; public string Apellido    <br />&#160;&#160;&#160; {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; get { return apellido; }     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; set { apellido = value; }     <br />&#160;&#160;&#160; }     <br />&#160;&#160;&#160; public int Edad     <br />&#160;&#160;&#160; {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; get { return edad; }     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; set { edad = value; }     <br />&#160;&#160;&#160; }     <br />&#160;&#160;&#160; public DateTime FechaIngreso     <br />&#160;&#160;&#160; {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; get     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return fechaIngreso;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; set     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; fechaIngreso = value;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; DiasLaborados = (DateTime.Now.Subtract(fechaIngreso).Days);     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }     <br />&#160;&#160;&#160; }     <br />&#160;&#160;&#160; public string Telefono     <br />&#160;&#160;&#160; {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; get { return telefono; }     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; set { telefono = value; }     <br />&#160;&#160;&#160; }&#160; <br />&#160;&#160;&#160; public int DiasLaborados     <br />&#160;&#160;&#160; {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; get     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return diasLaborados;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; set     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; diasLaborados = value;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }     <br />&#160;&#160;&#160; }</p>
<p>}</p>
<p><strong>Serialización en formato Binario      <br /></strong>Como se mencionó anteriormente, éste método se utiliza generalmente para intercambiar información con otros sistemas a través de la red. Sin embargo para agilidad en la ilustración de su funcionamiento, los datos serializados en este post, se enviarán a un archivo de texto para visualizar su contenido. Esta serialización tiene la desventaja que solo funcionará entre aplicaciones .NET, es decir, que tanto la aplicación que serializa como la aplicación que deserializa deben ser aplicaciones desarrolladas bajo la plataforma .NET.</p>
<p align="justify">El primer paso para serializar un objeto en .NET, es incluir el atributo <strong>Serializable </strong>en la definición de nuestra clase así:</p>
<p>[Serializable]    <br />public class Empleado     <br />{…]</p>
<p align="justify">Esto le indicará al runtime de .NET que este objeto estará habilitado para ser serializado cuando se requiera, de lo contrario, se generará una excepción del tipo System.Runtime.Serialization.SerializationException.</p>
<p align="justify">Luego de esto, implementar la serialización binaria es tan sencillo como invocar el método Serialize de la clase BinaryFormatter que encontramos en el namespace System.Runtime.Serialization. Este método recibe como parámetros un Stream y el objeto que deseamos serializar, por ejemplo:</p>
<p><a href="http://developmania.files.wordpress.com/2009/07/image.png"><img title="image" style="display:inline;border-width:0;" height="180" alt="image" src="http://developmania.files.wordpress.com/2009/07/image_thumb.png?w=520&#038;h=180" width="520" border="0" /></a> </p>
<p>Si abrimos el archivo datoSerializado.txt, obtenemos:</p>
<p><a href="http://developmania.files.wordpress.com/2009/07/image1.png"><img title="image" style="display:inline;border-width:0;" height="79" alt="image" src="http://developmania.files.wordpress.com/2009/07/image_thumb1.png?w=521&#038;h=79" width="521" border="0" /></a> </p>
<p align="justify">Como se ve en la figura, la información obtenida después del proceso de serialización contiene una serie de caracteres especiales. Esto es porque en realidad estamos serializando en formato binario y el bloc de notas no esta en capacidad de interpretar este tipo de información. Sin embargo, en la vida real, se supone que ese stream es enviado a través de la red y recibido por una aplicación destino, la cual utilizará el método Deserialize del objeto BinaryReader para obtener el objeto Empleado que fue enviado inicialmente, así:</p>
<p><a href="http://developmania.files.wordpress.com/2009/07/image2.png"><img title="image" style="display:inline;border-width:0;" height="109" alt="image" src="http://developmania.files.wordpress.com/2009/07/image_thumb2.png?w=516&#038;h=109" width="516" border="0" /></a> </p>
<p>Lo cual da como resultado lo siguiente:</p>
<p><a href="http://developmania.files.wordpress.com/2009/07/image3.png"><img title="image" style="display:inline;border-width:0;" height="132" alt="image" src="http://developmania.files.wordpress.com/2009/07/image_thumb3.png?w=353&#038;h=132" width="353" border="0" /></a> </p>
<p align="justify">Profundizando un poco más en el como el runtime de .NET serializa los datos, debemos saber que en tiempo de ejecución el runtime convierte en bytes cada uno de los miembros del objeto sin importar el tipo o nivel de acceso (public, private, protected, etc). Esto en algunas ocasiones puede no ser lo que deseemos hacer, sino mas bien omitir algunos campos que consideramos no son necesarios al momento de serializar. En nuestro ejemplo especifico, para que queremos serializar el campo <em>díasLaborados</em> si puede ser calculado en tiempo de ejecución?. Esto implica un costo que podemos evitar ya que a mayor cantidad de miembros a serializar, mayor cantidad de información tendrá que ser transferida por red o almacenada en disco.</p>
<p align="justify">Para modificar el comportamiento de la serialización binaria, podemos utilizar el atributo <strong>NonSerialized </strong>en cada uno de los miembros que deseamos omitir, así:</p>
<p>[NonSerialized]    <br />private int diasLaborados;</p>
<p align="justify">Con esto logramos que el resultado de la serialización sea el siguiente:</p>
<p><a href="http://developmania.files.wordpress.com/2009/07/image4.png"><img title="image" style="display:inline;border-width:0;" height="77" alt="image" src="http://developmania.files.wordpress.com/2009/07/image_thumb4.png?w=517&#038;h=77" width="517" border="0" /></a> </p>
</p>
<p>Donde se puede ver que ya no existe ninguna información referente al miembro diasLaborados. Sin embargo, al momento de ejecutar la aplicación destino y deserializar el objeto, obtenemos lo siguiente:    </p>
<p align="justify"><a href="http://developmania.files.wordpress.com/2009/07/image5.png"><img title="image" style="display:block;float:none;margin-left:auto;margin-right:auto;border-width:0;" height="166" alt="image" src="http://developmania.files.wordpress.com/2009/07/image_thumb5.png?w=440&#038;h=166" width="440" border="0" /></a>&#160; <br />Donde podemos observar que no se está calculando el valor del campo diasLaborados. Esto se debe a que el proceso de deserialización lo que hace es “<em>recrear” </em>el estado del objeto serializado y como el campo diasLaborados no está incluido en la información serializada, es omitido en el proceso de deserialización.</p>
<p align="justify">Por fortuna, existe la interfaz IDeserializationCallback, la cual incluye el método OnDeserialization que es llamado una vez termina el proceso de deserialización del objeto. Implementar esta interfaz solucionará nuestro problema ya que en dicho método podemos calcular el valor del miembro diasLaborados y así garantizamos que siempre que se realice una deserialización del objeto, se tendrá el estado completo del mismo. Para implementar la interfaz, se hace lo siguiente sobre el objeto Empleado: </p>
<p>[Serializable]    <br />public class Empleado:IDeserializationCallback     <br />{     <br />&#160;&#160;&#160;&#160; //Definicon de miembros</p>
<p>&#160;&#160;&#160;&#160; #region IDeserializationCallback Members </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; public void OnDeserialization(object sender)    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; DiasLaborados = (DateTime.Now.Subtract(fechaIngreso).Days);     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; #endregion</p>
<p>}</p>
<p>Así, ejecutando nuevamente el código que se encarga de realizar la deserialización tenemos:    <br />&#160;<a href="http://developmania.files.wordpress.com/2009/07/image6.png"><img title="image" style="display:block;float:none;margin-left:auto;margin-right:auto;border-width:0;" height="148" alt="image" src="http://developmania.files.wordpress.com/2009/07/image_thumb6.png?w=394&#038;h=148" width="394" border="0" /></a></p>
<p><strong>Serialización en formato SOAP.      <br /></strong>    <br />La serialización en formato SOAP, consiste en utilizar un formateador especial que genera un documento SOAP con la información del objeto que deseamos serializar. Este formato de serialización es el utilizado en los servicios Web por su gran interoperabilidad entre sistemas ya que me permite tener los sistemas desarrollados bajo diferentes plataformas e incluso ejecutándose en diferentes plataformas (Linux, Windows, etc). Sin embargo, una de las desventajas que tiene este formato de serialización es que genera una gran cantidad de información al serializar nuestro objeto (debido a que se debe cumplir con el estándar de los documentos SOAP). Por este motivo, es necesario analizar que tipo de serialización utilizar en nuestra aplicación. Así entonces tenemos que la serialización binaria es la más eficiente pero sólo nos sirve para escenarios donde las aplicaciones están desarrolladas en .NET. Si por el contrario, necesitamos compartir nuestros datos con aplicaciones desarrolladas en otros lenguajes y además cumplir con el estándar SOAP, utilizaremos el formato SOAP y finalmente si lo que necesitamos es compartir información con aplicaciones desarrolladas en otros lenguajes pero no es necesario cumplir con ningún estándar, podemos utilizar el formato XML.</p>
<p>Para serializar en formato SOAP, sólo se debe utilizar el formateador SoapFormatter que se encuentra en el namespace System.Runtime.Serialization.Formatters.Soap, así:    </p>
<p><a href="http://developmania.files.wordpress.com/2009/07/image7.png"><img title="image" style="display:inline;border-width:0;" height="162" alt="image" src="http://developmania.files.wordpress.com/2009/07/image_thumb7.png?w=516&#038;h=162" width="516" border="0" /></a> </p>
<p>Después de serializar obtenemos el siguiente resultado:    </p>
<p><a href="http://developmania.files.wordpress.com/2009/07/image8.png"><img title="image" style="display:block;float:none;margin-left:auto;margin-right:auto;border-width:0;" height="213" alt="image" src="http://developmania.files.wordpress.com/2009/07/image_thumb8.png?w=520&#038;h=213" width="520" border="0" /></a>&#160; <br />Como se ve en la figura, el comportamiento de la serialización en formato SOAP también se ve afectada por el uso del atributo <strong>NonSerialized </strong></p>
<p><strong>Serialización en formato XML. </strong></p>
<p>La serialización en formato XML consiste en transformar el objeto en un documento XML, donde por defecto, el nodo raíz será el tipo de dato que estemos serializando y sus miembros serán elementos de ese nodo raíz.    <br />La implementación de la serialización XML difiere un poco de las presentadas anteriormente ya que no se utiliza un formateador sino que se hace utilizando la clase <strong>XmlSerializer</strong> que se encuentra en el namespace System.Xml.Serialization. Esta clase recibe como parámetro el tipo de dato que deseamos serializar. Por ejemplo:     </p>
<p><a href="http://developmania.files.wordpress.com/2009/07/image9.png"><img title="image" style="display:inline;border-width:0;" height="159" alt="image" src="http://developmania.files.wordpress.com/2009/07/image_thumb9.png?w=500&#038;h=159" width="500" border="0" /></a>&#160; <br />De esta manera le estamos indicando al objeto XmlSerializer que deseamos serializar un objeto de tipo Empleado, el cual al momento de invocar el método Serialize, genera un documento XML como el siguiente:     </p>
<p><a href="http://developmania.files.wordpress.com/2009/07/image10.png"><img title="image" style="display:block;float:none;margin-left:auto;margin-right:auto;border-width:0;" height="127" alt="image" src="http://developmania.files.wordpress.com/2009/07/image_thumb10.png?w=480&#038;h=127" width="480" border="0" /></a></p>
<p>Como se puede ver en la figura anterior, el miembro diasLaborados fue serializado. Esto es porque la serialización XML no se ve afectada por el atributo <strong>NonSerialized. </strong>Sin embargo, la interface IDeserializationCallback si aplica para el proceso de la deserialización del objeto.</p>
<p>Para modificar el comportamiento de la serialización XML, se debe usar el atributo XmlIgnore sobre el miembro que deseamos omitir, así:    </p>
<p>[XmlIgnore]     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; public int DiasLaborados     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; get     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return diasLaborados;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; set     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; diasLaborados = value;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p>
<p>Es de notar que el atributo se ha utilizado sobre la propiedad DiasLaborados y no sobre el miembro diasLaborados. Esto es porque la serialización XML serializa únicamente los miembros públicos del objeto, por lo cual si usamos el atributo XmlIgnore sobre el miembro privado diasLaborados, el XmlSerializer igual seguiría generando el elemento DiasLaborados en el documento XML.</p>
<p>En el namespace System.Xml.Serialization, existen varios atributos que permiten modificar el comportamiento de la serialización XML y así obtener diferentes estructuras del documento XML generado. Uno de los atributos más usado es el <strong>XmlAttribute </strong>el cual se usa sobre cualquier miembro público y sirve para indicarle al runtime que dicho miembro lo genere como un atributo del nodo raíz y no como un elemento. Por ejemplo:</p>
<p>[XmlAttribute]    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; public int Identificacion     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; get     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return identificacion;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; set     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; identificacion = value;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }     <br />Luego de serializar nuevamente el objeto con el código ilustrado anteriormente, obtenemos:</p>
<p><a href="http://developmania.files.wordpress.com/2009/07/image11.png"><img title="image" style="display:inline;border-width:0;" height="106" alt="image" src="http://developmania.files.wordpress.com/2009/07/image_thumb11.png?w=493&#038;h=106" width="493" border="0" /></a> </p>
<p>Donde se ve claramente que el miembro Identificación es un atributo del nodo Empleado y no un elemento de dicho nodo como se había generado en el ejemplo previo.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/developmania.wordpress.com/216/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/developmania.wordpress.com/216/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/developmania.wordpress.com/216/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/developmania.wordpress.com/216/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/developmania.wordpress.com/216/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/developmania.wordpress.com/216/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/developmania.wordpress.com/216/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/developmania.wordpress.com/216/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/developmania.wordpress.com/216/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/developmania.wordpress.com/216/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/developmania.wordpress.com/216/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/developmania.wordpress.com/216/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/developmania.wordpress.com/216/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/developmania.wordpress.com/216/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=developmania.wordpress.com&amp;blog=3736555&amp;post=216&amp;subd=developmania&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://developmania.wordpress.com/2009/07/02/serializacion-de-datos-en-c/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">fzapataramirez</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2009/07/image_thumb.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2009/07/image_thumb1.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2009/07/image_thumb2.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2009/07/image_thumb3.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2009/07/image_thumb4.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2009/07/image_thumb5.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2009/07/image_thumb6.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2009/07/image_thumb7.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2009/07/image_thumb8.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2009/07/image_thumb9.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2009/07/image_thumb10.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2009/07/image_thumb11.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
		<item>
		<title>Introducción a la criptografía</title>
		<link>http://developmania.wordpress.com/2009/03/19/introduccion-a-la-criptografia/</link>
		<comments>http://developmania.wordpress.com/2009/03/19/introduccion-a-la-criptografia/#comments</comments>
		<pubDate>Thu, 19 Mar 2009 20:15:20 +0000</pubDate>
		<dc:creator>fzapataramirez</dc:creator>
				<category><![CDATA[Programación(Intermedia)]]></category>
		<category><![CDATA[cifrado]]></category>
		<category><![CDATA[cifrado asimetrico]]></category>
		<category><![CDATA[cifrado simetrico]]></category>
		<category><![CDATA[cifrar]]></category>
		<category><![CDATA[criptografia]]></category>
		<category><![CDATA[encriptar]]></category>

		<guid isPermaLink="false">http://developmania.wordpress.com/?p=186</guid>
		<description><![CDATA[  Una de las tareas mas habituales a la hora de proteger información, es sin duda alguna el cifrado de datos. Mediante esta técnica podemos incrementar el nivel de seguridad de los datos que maneja nuestra aplicación, estableciendo un control sobre quien puede leer y/o modificar dicha información. Hay que tener presente que la criptografía [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=developmania.wordpress.com&amp;blog=3736555&amp;post=186&amp;subd=developmania&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<div><span style="font-size:9pt;font-family:&quot;"><span style="font-size:9pt;font-family:&quot;"></span></span></div>
<p> </p>
<p><span style="font-size:9pt;font-family:&quot;"><span style="font-size:9pt;font-family:&quot;"></p>
<p style="line-height:12.9pt;text-align:justify;"><span style="font-size:9pt;font-family:&quot;">Una de las tareas mas habituales a la hora de proteger información, es sin duda alguna el cifrado de datos. Mediante esta técnica podemos incrementar el nivel de seguridad de los datos que maneja nuestra aplicación, estableciendo un control sobre quien puede leer y/o modificar dicha información.</span></p>
<p style="line-height:12.9pt;text-align:justify;"><span style="font-size:9pt;font-family:&quot;">Hay que tener presente que la criptografía no evita el que las personas que no deben, accedan a la información que tratamos de proteger, sino que evita el entendimiento de la misma, que a la final es lo que nos importa ya que de &#8220;nada&#8221; le sirve al atacante acceder a las contraseñas de los usuarios de mi sistema si estas contienen un conjunto de caracteres &#8220;incoherentes&#8221;.</span></p>
<p style="line-height:12.9pt;text-align:justify;"><span style="font-size:9pt;font-family:&quot;">Por ejemplo, digamos que se tiene la cadena &#8220;894658987&#8243; la cual representa el número de la tarjeta de crédito de un usuario de mi sistema. Al ser esto un dato crítico, considero que debería mantenerlo cifrado en mi base de datos para evitar que un atacante tenga acceso a esta información en caso de que logre vulnerar mi servidor de base de datos. Para esto, se aplica un algoritmo de cifrado mediante el cual se obtiene una cadena &#8220;incoherente&#8221; para todo aquel que no haga el proceso de descifrado. Para este caso, la cadena cifrada sería algo como Y=?)(/&amp;%ttr6%.</span></p>
<p style="line-height:12.9pt;text-align:justify;"><span style="font-size:9pt;font-family:&quot;">La única manera de obtener la cadena original es aplicando el proceso de descifrado con el mismo algoritmo que se utilizó para cifrar la cadena. La ventaja de todo esto, es que no cualquiera puede descifrar la cadena ya que en los algoritmos criptográficos utilizan llaves (equivalentes a una contraseña) para cifrar y se descifrar y además se garantiza que solo con la llave correcta se puede descifrar. Esto es algo parecido a los procesos de autenticación por contraseña, donde la seguridad está basada en la privacidad de la contraseña. Del mismo modo, la seguridad del cifrado radica en la privacidad de la llave porque todo el que la tenga, podrá acceder a la cadena original.</span></p>
<p style="line-height:12.9pt;text-align:justify;"><span style="font-size:9pt;font-family:&quot;">Pero que es una llave?. Una llave no es más que un conjunto de bytes que cumplen ciertas condiciones según el algoritmo. Uno de los aspectos más importantes de las llaves es su longitud. La longitud de una llave se mide generalmente en bits y se determina según el algoritmo de cifrado utilizado. Por ejemplo el algoritmo DES utiliza llaves de 56 bits. Gran parte de la seguridad de las llaves radica en su longitud debido a que entre más pequeña sea, más fácil será obtener la combinación de bytes mediante fuerza bruta. Por esta razón, quizás la longitud de las llaves utilizadas, sea un factor para elegir el algoritmo de cifrado a utilizar en nuestra aplicación.</span></p>
<p style="line-height:12.9pt;text-align:justify;"><span style="font-size:9pt;font-family:&quot;">Otro de los factores que influye a la hora de elegir el algoritmo adecuado, es el tipo de criptografía que se utiliza: Publica (Asimétrica) o Privada (Simétrica). Ambas son técnicas que difieren en cómo se utiliza la o las llaves de cifrado. A continuación se dará una breve explicación sobre cada una.</span></p>
<p style="line-height:12.9pt;text-align:justify;"><strong><span style="font-size:9pt;font-family:&quot;">Cifrado Simétrico (Privado)</span></strong><span style="font-size:9pt;font-family:&quot;"> </span></p>
<p style="line-height:12.9pt;text-align:justify;"><span style="font-size:9pt;font-family:&quot;">El cifrado simétrico, utiliza una llave para cifrar y descifrar el mensaje, es decir, se utiliza exactamente la misma llave tanto para cifrar como para descifrar. Esto implica que la llave deberá ser compartida entre todos los que deben acceder a los datos cifrados, lo cual implica un riesgo de seguridad ya que si por ejemplo se transfiere la llave por la red (correo electrónico por ejemplo), existe la posibilidad de que una persona no deseada tenga acceso a la llave y pueda acceder a la información confidencial cifrada.</span></p>
<p style="line-height:12.9pt;text-align:justify;"><span style="font-size:9pt;font-family:&quot;">El proceso consiste entonces en emplear uno de los algoritmos de cifrado simétrico existentes (DES, AES, 3DES, etc) con una llave especifica. Después de aplicar el algoritmo se obtendrá la cadena cifrada que podrá ser transmitida por la red o almacenada en algún lugar específico. Luego cuando sea necesario conocer la cadena original, el destinatario (aplicación, servidor, persona, etc.) deberá usar el mismo algoritmo y la misma llave que se utilizaron para cifrar el mensaje. Únicamente, aquellos remitentes que tengan la llave, podrán descifrar el mensaje.</span></p>
<p style="line-height:12.9pt;text-align:justify;"><strong><span style="font-size:9pt;font-family:&quot;">Cifrado Asimétrico (Público)</span></strong><span style="font-size:9pt;font-family:&quot;"> </span></p>
<p style="line-height:12.9pt;text-align:justify;"><span style="font-size:9pt;font-family:&quot;">La técnica de cifrado asimétrico no es una mejora de la técnica anterior, es más, no es posible decir que el cifrado asimétrico es mejor que el simétrico ni viceversa. La técnica de cifrado asimétrico, nació para atacar nuevas necesidades.</span></p>
<p style="line-height:12.9pt;text-align:justify;"><span style="font-size:9pt;font-family:&quot;">A lo que voy es que uno de los puntos que ataca el cifrado asimétrico es el hecho de tener que compartir la llave secreta y está pensado para facilitar la comunicación entre un remitente y un destinatario sin necesidad de correr un riesgo a la hora de compartir la llave.</span></p>
<p style="line-height:12.9pt;text-align:justify;"><span style="font-size:9pt;font-family:&quot;"><span> </span>El cifrado asimétrico usa un total de dos llaves para cifrar los mensajes. Una llave privada y una llave pública. Como sus nombres lo indican, la llave privada es personal y no deberá ser divulgada bajo ninguna circunstancia (ni siquiera a los destinatarios con los que deseo comunicarme), mientras que la llave publica podrá ser publicada y divulgada.</span></p>
<p style="line-height:12.9pt;text-align:justify;"><span style="font-size:9pt;font-family:&quot;">El secreto de esta técnica radica en que todo lo que se cifre con la llave privada, solo podrá ser descifrado con la llave pública y todo lo que se cifre con la llave pública sólo podrá ser descifrado con la llave privada. Esto implica entonces que lo que yo cifre con mi llave privada, podrá ser interpretado por todo aquel que tenga mi llave pública (que en teoría es todo el mundo porque es pública y generalmente se comparte en un servidor Web por ejemplo). De este modo el destinatario solo estaría seguro (en teoría) que el mensaje enviado lo escribí yo y digo que en teoría porque eso no sería cierto en caso de que mi llave privada la tenga otra persona.</span></p>
<p style="line-height:12.9pt;text-align:justify;"><span style="font-size:9pt;font-family:&quot;">En sentido contrario, si el remitente usa la llave publica del destinatario, se podrá garantizar que el mensaje sólo podrá ser descifrado por el destinatario ya que sólo él tiene su propia llave privada. Esto evita entonces el riesgo que implica el tener que compartir una llave que es privada como se tiene que hacer en el cifrado simétrico ya que lo que se comparte en este caso en una llave publica que no hay ningún peligro de que se conozca.</span></p>
<p style="line-height:12.9pt;text-align:justify;"><span style="font-size:9pt;font-family:&quot;">Lo que hay que tener presente en esta técnica, es que si yo deseo comunicarme con un destinatario siempre debo usar la llave pública del destinatario para garantizar que solo él podrá entender el mensaje. Si yo firmara el mensaje con mi llave privada, lo podría descifrar todo el que tenga mi llave pública, lo cual no garantizaría privacidad de los datos sino que le garantizaría al destinatario que yo fui quien escribí el mensaje (esta es la base de las firmas digitales).</span></p>
<p style="line-height:12.9pt;text-align:justify;"><span style="font-size:9pt;font-family:&quot;">El algoritmo adecuado para usar en nuestras aplicaciones va de acuerdo a las necesidades de cada quien. Si se pretende cifrar información que solo será descifrada por la misma aplicación o por otras pocas, es buena idea usar el cifrado simétrico ya que es más rápido y requiere menos procesamiento. Por otro lado, si la información que se cifra es para compartirla por la red o hacia múltiples destinatarios, será buena idea usar cifrado asimétrico para evitar los riesgos de compartir la llave privada.</span></p>
<p class="MsoNormal" style="text-align:justify;margin:0 0 10pt;"><span style="font-size:9pt;line-height:115%;font-family:&quot;"> </span></p>
<p style="line-height:12.9pt;text-align:justify;"> </p>
<p> </p>
<p></span></span></p>
<p style="line-height:12.9pt;text-align:justify;"> </p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/developmania.wordpress.com/186/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/developmania.wordpress.com/186/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/developmania.wordpress.com/186/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/developmania.wordpress.com/186/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/developmania.wordpress.com/186/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/developmania.wordpress.com/186/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/developmania.wordpress.com/186/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/developmania.wordpress.com/186/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/developmania.wordpress.com/186/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/developmania.wordpress.com/186/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/developmania.wordpress.com/186/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/developmania.wordpress.com/186/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/developmania.wordpress.com/186/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/developmania.wordpress.com/186/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=developmania.wordpress.com&amp;blog=3736555&amp;post=186&amp;subd=developmania&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://developmania.wordpress.com/2009/03/19/introduccion-a-la-criptografia/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">fzapataramirez</media:title>
		</media:content>
	</item>
		<item>
		<title>Excelente oportunidad para administrar tu dinero.</title>
		<link>http://developmania.wordpress.com/2009/01/25/excelente-oportunidad-para-administrar-tu-dinero/</link>
		<comments>http://developmania.wordpress.com/2009/01/25/excelente-oportunidad-para-administrar-tu-dinero/#comments</comments>
		<pubDate>Sun, 25 Jan 2009 15:57:27 +0000</pubDate>
		<dc:creator>fzapataramirez</dc:creator>
				<category><![CDATA[Recomendaciones]]></category>
		<category><![CDATA[finanzas personales]]></category>
		<category><![CDATA[gestor de dinero]]></category>
		<category><![CDATA[money manager]]></category>
		<category><![CDATA[prestamo]]></category>

		<guid isPermaLink="false">http://developmania.wordpress.com/?p=183</guid>
		<description><![CDATA[Les recomiendo el sitio www.fmoneymanager.com, el cual es una aplicación Web que te permite gestionar todo lo relacionado con las finanzas personales, incluyendo préstamos, ingresos, egresos, permitiendonos tener un control total sobre como nos gastamos el dinero y en que lo estamos invirtiendo. Visitenlo, es totalmente gratis y es un proyecto que tiene mucho futuro [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=developmania.wordpress.com&amp;blog=3736555&amp;post=183&amp;subd=developmania&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Les recomiendo el sitio <a href="http://www.fmoneymanager.com">www.fmoneymanager.com</a>, el cual es una aplicación Web que te permite gestionar todo lo relacionado con las finanzas personales, incluyendo préstamos, ingresos, egresos, permitiendonos tener un control total sobre como nos gastamos el dinero y en que lo estamos invirtiendo.</p>
<p>Visitenlo, es totalmente gratis y es un proyecto que tiene mucho futuro porque según me enteré, tienen bastantes cosas por ofrecer.</p>
<p> </p>
<p>Suerte !!!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/developmania.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/developmania.wordpress.com/183/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/developmania.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/developmania.wordpress.com/183/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/developmania.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/developmania.wordpress.com/183/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/developmania.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/developmania.wordpress.com/183/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/developmania.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/developmania.wordpress.com/183/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/developmania.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/developmania.wordpress.com/183/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/developmania.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/developmania.wordpress.com/183/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=developmania.wordpress.com&amp;blog=3736555&amp;post=183&amp;subd=developmania&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://developmania.wordpress.com/2009/01/25/excelente-oportunidad-para-administrar-tu-dinero/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">fzapataramirez</media:title>
		</media:content>
	</item>
		<item>
		<title>Introducción a J2ME</title>
		<link>http://developmania.wordpress.com/2008/12/01/introduccion-a-j2me/</link>
		<comments>http://developmania.wordpress.com/2008/12/01/introduccion-a-j2me/#comments</comments>
		<pubDate>Mon, 01 Dec 2008 21:17:44 +0000</pubDate>
		<dc:creator>fzapataramirez</dc:creator>
				<category><![CDATA[Aplicaciones moviles]]></category>
		<category><![CDATA[Programación(Básica)]]></category>
		<category><![CDATA[dispositivos moviles]]></category>
		<category><![CDATA[J2ME]]></category>
		<category><![CDATA[smart device]]></category>
		<category><![CDATA[wireless toolkit]]></category>

		<guid isPermaLink="false">http://developmania.wordpress.com/?p=162</guid>
		<description><![CDATA[Una de las tecnologías que se puede utilizar para desarrollar aplicaciones es la que nos brinda sun con su edición reducida de java J2ME (Java 2 Micro Edition). El J2ME, es un subconjunto de packages, clases, interfaces, etc. del java que se conoce normalmente para desarrollar aplicaciones de escritorio o web, y tiene un tamaño bastante [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=developmania.wordpress.com&amp;blog=3736555&amp;post=162&amp;subd=developmania&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<div></div>
<div><span style="font-size:6.5pt;color:black;font-family:&quot;"></span></div>
<p><span style="font-size:6.5pt;color:black;font-family:&quot;"><span style="font-size:8pt;color:black;font-family:&quot;"></p>
<p style="text-align:justify;"><span style="font-size:10pt;color:black;font-family:&quot;">Una de las tecnologías que se puede utilizar para desarrollar aplicaciones es la que nos brinda sun con su edición reducida de java J2ME (Java 2 Micro Edition).</span></p>
<p style="text-align:justify;"><span style="font-size:10pt;color:black;font-family:&quot;">El J2ME, es un subconjunto de packages, clases, interfaces, etc. del java que se conoce normalmente para desarrollar aplicaciones de escritorio o web, y tiene un tamaño bastante pequeño lo cual permite ejecutarse en dispositivos con capacidad limitada de procesamiento y/o almacenamiento.</span></p>
<p style="text-align:justify;"><span style="font-size:10pt;color:black;font-family:&quot;">Como lo mencione en un <strong><span style="font-family:&quot;"><a href="http://developmania.wordpress.com/2008/07/04/comenzando-moviles/" target="_blank">post anterior</a></span></strong>, para desarrollar aplicaciones móviles en J2ME debemos tener en cuenta los perfiles y las configuraciones. Por parte de las configuraciones tenemos las opciones CLDC o CDC y por parte de los perfiles contamos con el MIDP.</span></p>
<p style="text-align:justify;"><span style="font-size:10pt;color:black;font-family:&quot;">Una configuración puede entenderse como un agrupamiento de paquetes y clases. Así, se tendrá una base común para todos los dispositivos que soporten determinada configuración. La configuración CLDC (Connected Limited Device Configuration) es la configuración que menos clases tiene, ya que está pensada para dispositivos con una capacidad de procesamiento y de memoria bastante bajos, como por ejemplo los celulares y PDA. La configuración CDC Connected Device Configuration está pensada para dispositivos con mejores capacidades de procesamiento como televisores, controles remotos, etc.</span></p>
<p style="text-align:justify;"><span style="font-size:10pt;color:black;font-family:&quot;">Por lo anterior, sobra decir que la configuración que se debe utilizar para desarrollar aplicaciones para dispositivos como PDA y celulares es la CLDC, la cual usa una versión reducida de la maquina virtual conocida como KVM (Kilo Virtual Machine, el &#8220;kilo&#8221; se debe a su diminuto peso).</span></p>
<p style="text-align:justify;"><span style="font-size:10pt;color:black;font-family:&quot;">Por otro lado, los perfiles son clases de alto nivel que complementan a las configuraciones, con el fin de dotar al dispositivo de un entorno de ejecución completo para las aplicaciones. Para dispositivos como celulares y PDAS se debe usar el perfil MIDP (Mobile Information Device Profile), que contiene gran parte de clases de Interfaz de usuario.</span></p>
<p style="text-align:justify;"><span style="font-size:10pt;color:black;font-family:&quot;">En la actualidad contamos con varias versiones de cada configuración y perfil. Así, para la configuración CLDC tenemos la versión 1.0 y la versión 1.1, siendo la principal diferencia entre ellas, el que la versión 1.0 no trabaja con valores de punto flotante, mientras la segunda sí. Esto se traduce en que CLDC 1.0 no admite valores de punto flotante, es decir, que los teléfonos que tengan la versión 1.0 de la configuración CLDC no pueden trabajar con tipos de datos como double, float. Por esta razón, si nuestra aplicación necesita trabajar con datos numéricos que contengan decimales, el primer requisito que debemos tener en cuenta para el dispositivo que ejecutara la aplicación es que tenga la versión 1.1 de CLDC.</span></p>
<p style="text-align:justify;"><span style="font-size:10pt;color:black;font-family:&quot;">Por el lado del perfil MIDP, contamos actualmente con 3 versiones 1.0, 2.0 y 2.1, siendo la más utilizada ahora la 2.0 ya que la 2.1 solo la traen los teléfonos de última generación.</span></p>
<p style="text-align:justify;"><span style="font-size:10pt;color:black;font-family:&quot;">El primer paso a dar a la hora de comenzar con el desarrollo de una aplicación móvil, es elegir la plataforma de desarrollo. Personalmente me he inclinado por Netbeans ya que ofrece una gran facilidad a la hora de diseñar la parte visual de nuestra aplicación. También he escuchado que eclipse ha progresado bastante en cuanto a eso pero nunca lo he probado, por lo que a continuación indicaré a grandes rasgos que se necesita para desarrollar una aplicación j2ME en Netbeans.</span></p>
<p style="text-align:justify;"><span style="font-size:10pt;color:black;font-family:&quot;">Netbeans cuenta con varias &#8220;distribuciones&#8221;, según el tipo de aplicación que tengamos pensado desarrollar. Para desarrollar aplicaciones móviles, necesitamos descargar la versión &#8220;All&#8221; que podremos encontrar en la página <a href="http://www.netbeans.org/downloads/index.html"><span style="color:#800080;">http://www.netbeans.org/downloads/index.html</span></a>. Esta es la versión ideal ya que trae incorporado todo lo necesario para el desarrollo de aplicaciones móviles. Sin embargo, si y ase cuenta con una versión diferente de netbeans instalada, se puede descargar la última versión del Wireless Toolkit para adicionarle el soporte para j2me.</span></p>
<p style="text-align:justify;"><span style="font-size:10pt;color:black;font-family:&quot;">El primer requisito para instalar Netbeans, es tener instalado el JDk en la maquina, el cual se puede descargar gratuitamente de la pagina de sun. Es recomendable tener la última versión del JDK, incluyendo los updates ya que así podremos acceder a las correcciones de bugs detectadas y/o nuevas funcionalidades.</span></p>
<p style="text-align:justify;"><span style="font-size:10pt;color:black;font-family:&quot;">Una vez instalado el Netbeans, solo tenemos que abrir el IDE, hacer clic en File &gt; New Project y seleccionar la opción MIDP Application que se encuentra en la categoría Mobility, tal y como se muestra a continuación.</span></p>
<p style="text-align:justify;"><span style="font-size:10pt;"><a href="http://developmania.files.wordpress.com/2008/12/netbeans.gif"></a></span></p>
<p> </p>
<p> </p>
<p> </p>
<p></span></span></p>
<p style="text-align:justify;"><span style="font-size:10pt;color:black;font-family:&quot;"><a href="http://developmania.files.wordpress.com/2008/12/netbeans.gif"><img class="aligncenter size-full wp-image-170" title="netbeans" src="http://developmania.files.wordpress.com/2008/12/netbeans.gif?w=500&#038;h=355" alt="netbeans" width="500" height="355" /></a></span></p>
<p style="text-align:justify;"><span style="font-size:10pt;color:black;font-family:&quot;">Luego debemos seleccionar la versión del MIDP y del CLDC que deseamos utilizar en nuestro proyecto. Es importante tener en cuenta este dato antes de comenzar el proyecto ya que una mala elección de estas versiones podría dejar inutilizable la aplicación en los dispositivos reales.</span></p>
<p style="text-align:justify;"><span style="font-size:10pt;color:black;font-family:&quot;">En este paso, también debemos elegir el dispositivo (device) con el que queremos ejecutar la aplicación. Esta opción es para indicarle a Netbeans que cada que nosotros ejecutemos nuestra aplicación con el comando ejecutar de netbeans, abra automáticamente el emulador del dispositivo seleccionado. Esta elección no afecta para nada la aplicación final ni implica que la aplicación solo podrá ejecutarse en dicho dispositivo, únicamente es una elección para emular el comportamiento de la misma en tiempo de desarrollo.</span></p>
<p style="text-align:justify;"><span style="font-size:10pt;color:black;font-family:&quot;">Por defecto, Netbeans trae instalados unos emuladores básicos con los que podemos probar el funcionamiento de nuestras aplicaciones. Sin embargo, cada fabricante de dispositivos, provee emuladores más específicos para poder emular la ejecución de la aplicación en un entorno más real. Así por ejemplo si la aplicación está siendo desarrollada para celulares Nokia 6100, tenemos la posibilidad de descargar un emulador de dicha plataforma para tener una ejecución mucho más realista.</span></p>
<p style="text-align:justify;"><span style="font-size:10pt;color:black;font-family:&quot;">Aquí vamos entendiendo que eso de la portabilidad de java no deja de ser pura teoría, porque la misma aplicación puede comportarse de manera diferente en distintos dispositivos. Para que necesito yo una aplicación que se pueda instalar y ejecutar en cualquier dispositivo con CLDC 1.1, si funcionalmente es inservible en algunos? A lo que me refiero es a que es probable que la aplicación si instale en todos los dispositivos CLDC 1.1, pero que solo funcione correctamente en los Nokia.</span></p>
<p style="text-align:justify;"><span style="font-size:10pt;color:black;font-family:&quot;">Esto se debe, porque además de la configuración y el perfil que soporte cada dispositivo, debemos tener en cuenta los JSR (Java Specification Request) con los que este equipado, y peor aún, cada fabricante de dispositivos puede implementar de manera diferente los JSR.</span></p>
<p style="text-align:justify;"><span style="font-size:10pt;color:black;font-family:&quot;"> Los JSR son un conjunto de clases que complementan las librerías bases ofrecidas por la configuración. Para que quede más claro, recordemos que todos los dispositivos que soporten la misma versión de CLDC van a tener las mismas librerías o clases bases. Pero si somos realistas, cada teléfono es diferente, algunos pueden tener bluetooth, otros pueden tener capacidad de acceso a Internet mientras que otros no. Cada JSR ataca funcionalidades especificas, por lo que podremos encontrar un jsr que se encarga de la funcionalidad del bluetooth, otro JSR que se encarga de las peticiones HTTP y SOAP (clientes de servicios web), etc.</span></p>
<p style="text-align:justify;"><span style="font-size:10pt;color:black;font-family:&quot;">Por lo anterior, es necesario verificar que librerías adicionales estamos utilizando (JSR) estamos utilizando ya que eso será un requisito mas para el dispositivo que ejecute la aplicación. Por ejemplo, si la aplicación móvil consume un web service, estamos utilizando el JSR 172 y será requisito indispensable que el dispositivo cuente con la implementación de dicho jsr ya que de lo contrario la aplicación no funcionara correctamente.</span></p>
<p style="text-align:justify;"><span style="font-size:10pt;color:black;font-family:&quot;">A manera de conclusión entonces, tenemos que las aplicaciones móviles desarrolladas en Java no son tan portables como dice la teoría ya que el correcto funcionamiento de la misma en diferentes teléfonos depende de las librerías que implemente cada celular.</span></p>
<p style="text-align:justify;"><span style="font-size:10pt;color:black;font-family:&quot;">Por ejemplo, supongamos que en la aplicación se implementa un control Tabla con la funcionalidad de scroll horizontal y vertical, el cual se utiliza para mostrar información tabulada. Es posible (y casi certero) que la misma tabla funcione correctamente en unos dispositivos mientras que en otros no funcione el scroll vertical y en otros no funcione ningún tipo de scroll. Esto se debe a que como lo comente anteriormente, cada fabricante puede implementar de manera diferente cada API de java. En este caso especifico, pudiera deberse a que los fabricantes de los dispositivos implementan de manera diferente el método encargado del LAYOUT o &#8220;distribución de controles en pantalla&#8221;.</span></p>
<p style="text-align:justify;"><span style="font-size:10pt;color:black;font-family:&quot;">Por tal motivo es recomendable:</span></p>
<p style="text-align:justify;"><span style="font-size:10pt;color:black;font-family:&quot;">1. Entender, que en pocas ocasiones la misma aplicación sirve en diferentes tipos de dispositivos.</span></p>
<p style="text-align:justify;"><span style="font-size:10pt;color:black;font-family:&quot;">2. Analizar que versión de CLDC y MIDP se va a utilizar, teniendo en cuenta que eso será requisito para el dispositivo en que se ejecutara la aplicación.</span></p>
<p style="text-align:justify;"><span style="font-size:10pt;color:black;font-family:&quot;">3. Analizar que JSR se están utilizando para incluirlos como requisito del dispositivo que ejecuten.</span></p>
<p style="text-align:justify;"><span style="font-size:10pt;color:black;font-family:&quot;">4. Probar la aplicación inicialmente en el emulador genérico de Netbeans, luego descargar el emulador del dispositivo específico en el que se ejecutara l aplicación (Nokia, Motorola, Blackberry, Sony Ericsson, etc.)</span></p>
<p style="text-align:justify;"><span style="font-size:10pt;color:black;font-family:&quot;">5 Finalmente desplegar la aplicación a los dispositivos reales, estando dispuesto a sorpresitas poco deseadas, porque recuerda, con J2ME, Write Anywhere, Run Once.</span></p>
<p style="text-align:justify;"><span style="font-size:10pt;color:black;font-family:&quot;"> </span></p>
<p style="text-align:justify;"><span style="font-size:10pt;color:black;font-family:&quot;">Suerte !!!</span></p>
<p style="line-height:9.65pt;text-align:justify;"> </p>
<p style="line-height:9.65pt;text-align:justify;"> </p>
<p style="line-height:9.65pt;text-align:justify;"> </p>
<p style="line-height:9.65pt;text-align:justify;"> </p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/developmania.wordpress.com/162/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/developmania.wordpress.com/162/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/developmania.wordpress.com/162/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/developmania.wordpress.com/162/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/developmania.wordpress.com/162/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/developmania.wordpress.com/162/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/developmania.wordpress.com/162/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/developmania.wordpress.com/162/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/developmania.wordpress.com/162/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/developmania.wordpress.com/162/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/developmania.wordpress.com/162/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/developmania.wordpress.com/162/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/developmania.wordpress.com/162/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/developmania.wordpress.com/162/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=developmania.wordpress.com&amp;blog=3736555&amp;post=162&amp;subd=developmania&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://developmania.wordpress.com/2008/12/01/introduccion-a-j2me/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">fzapataramirez</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2008/12/netbeans.gif" medium="image">
			<media:title type="html">netbeans</media:title>
		</media:content>
	</item>
		<item>
		<title>Lectura y escritura de archivos en c#</title>
		<link>http://developmania.wordpress.com/2008/11/14/lectura-y-escritura-de-archivos-en-c/</link>
		<comments>http://developmania.wordpress.com/2008/11/14/lectura-y-escritura-de-archivos-en-c/#comments</comments>
		<pubDate>Fri, 14 Nov 2008 23:46:00 +0000</pubDate>
		<dc:creator>fzapataramirez</dc:creator>
				<category><![CDATA[Programación(Básica)]]></category>
		<category><![CDATA[archivos]]></category>
		<category><![CDATA[BinaryReader]]></category>
		<category><![CDATA[BinaryWriter]]></category>
		<category><![CDATA[escritura de archivos]]></category>
		<category><![CDATA[File]]></category>
		<category><![CDATA[FileStream]]></category>
		<category><![CDATA[lectura de archivos]]></category>
		<category><![CDATA[StreamReader]]></category>
		<category><![CDATA[StreamWriter]]></category>

		<guid isPermaLink="false">http://developmania.wordpress.com/2008/11/14/lectura-y-escritura-de-archivos-en-c/</guid>
		<description><![CDATA[El manejo de archivos en la plataforma .NET se logra mediante la clase Stream que representa un flujo de información (Un archivo es considerado un flujo de datos, al igual que los datos transferidos de un dispositivo a otro, o los datos transferidos por la red mediante TCP/IP). La clase Stream, es una clase abstracta, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=developmania.wordpress.com&amp;blog=3736555&amp;post=161&amp;subd=developmania&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>El manejo de archivos en la plataforma .NET se logra mediante la clase Stream que representa un flujo de información (Un archivo es considerado un flujo de datos, al igual que los datos transferidos de un dispositivo a otro, o los datos transferidos por la red mediante TCP/IP). </p>
<p>La clase Stream, es una clase abstracta, por lo que no es posible utilizarla directamente ya que no se puede crear instancias. Lo que se debe hacer es utilizar una de sus clases derivadas que se especializan en el tratamiento de streams para diferentes destinos como por ejemplo FileStream (para el manejo de archivos), Memorystream (para el manejo de datos en memoria), etc.</p>
<p>La primera opción para escribir y/o leer datos de una archivo de texto es utilizar la clase FileStream. Esta clase se encuentra en el namespace System.IO y es una clase derivada de la clase Stream.</p>
<p>El FileStream actúa como un intermediario entre el sistema de archivos y nuestra aplicación, permitiendo realizar de una manera limpia y sencilla operaciones de escritura y lectura en archivos. Para utilizar el FileStream, lo primero que se debe hacer es crear una instancia que apunte al archivo deseado. Para esto se tiene la opción de utilizar alguno de los constructores ofrecidos, tal y como se muestra a continuación:</p>
<p><a href="http://developmania.files.wordpress.com/2008/11/clip-image002.jpg"><img title="clip_image002" style="border-right:0;border-top:0;display:inline;border-left:0;border-bottom:0;" height="41" alt="clip_image002" src="http://developmania.files.wordpress.com/2008/11/clip-image002-thumb.jpg?w=500&#038;h=41" width="500" border="0" /></a></p>
<p>Como se ve en la figura anterior, es un constructor bastante tedioso de utilizar porque recibe una cantidad considerable de parámetros. Para contrarestar esto, tenemos la posibilidad de utilizar alguno de los métodos ofrecidos por la clase utilitaria File, que nos permite obtener un FileStream con parámetros específicos de acuerdo al método utilizado para obtenerlo. A continuación se muestra un ejemplo:</p>
<p><a href="http://developmania.files.wordpress.com/2008/11/clip-image004.jpg"><img title="clip_image004" style="border-right:0;border-top:0;display:inline;border-left:0;border-bottom:0;" height="36" alt="clip_image004" src="http://developmania.files.wordpress.com/2008/11/clip-image004-thumb.jpg?w=425&#038;h=36" width="425" border="0" /></a></p>
<p>En el ejemplo anterior se utilizó el método Create el cual crea el archivo en la ruta especificada y en caso de que el archivo exista, es sobrescrito. Estos métodos ofrecidos por la clase File, facilitan el desarrollo de aplicaciones con manejo de archivos y permite una mejor lectura de código.</p>
<p>Para escribir datos en un archivo de texto, se utilizan los métodos Write y WriteByte. El primero recibe como parámetro un vector de bytes que representa la información a almacenar, mientras el segundo recibe como parámetro un solo byte para ser escrito. Elegir cual de los dos métodos utilizar depende del escenario, ya que cuando se va a escribir gran cantidad de información, no es recomendable escribir byte a byte porque se ejecutaría muchas veces el mismo ciclo sino que por el contrario, es conveniente escribir varios bytes a la vez.</p>
<p>A continuación se muestra un ejemplo de la operación de escritura con ambos métodos:</p>
<p><a href="http://developmania.files.wordpress.com/2008/11/clip-image006.jpg"><img title="clip_image006" style="border-right:0;border-top:0;display:inline;border-left:0;border-bottom:0;" height="252" alt="clip_image006" src="http://developmania.files.wordpress.com/2008/11/clip-image006-thumb.jpg?w=513&#038;h=252" width="513" border="0" /></a></p>
<p>Se puede observar como se utiliza la clase Encoding para formatear la cadena en UTF8 y obtener el array de bytes que se debe escribir en el archivo. De la misma manera se puede codificar el texto a escribir en otro formato como por ejemplo ASCII, Unicode, etc.</p>
<p>Es importante mencionar que todo stream se debe cerrar al finalizar la operación que se realiza sobre el, ya que de lo contrario el archivo quedaría bloqueado y no se liberarían recursos del sistema operativo. Adicionalmente, el método Flush, se utiliza para indicarle a la clase FileStream, que escriba en el archivo físico lo que se ha escrito con el método WriteByte o con el método Write hasta el momento ya que de lo contrario, dichos cambios se verían reflejados únicamente cuando se cierre el Stream. Este método seria útil cuando queremos que se escriba el texto en el archivo y no deseamos cerrar el Stream porque necesitamos seguir haciendo operaciones de escritura, además de ser una buena práctica siempre utilizarlo aun cuando parezca ser innecesario.</p>
<p>La implementación de la misma funcionalidad con el otro método, seria como se muestra a continuación.</p>
<p><a href="http://developmania.files.wordpress.com/2008/11/clip-image008.jpg"><img title="clip_image008" style="border-right:0;border-top:0;display:inline;border-left:0;border-bottom:0;" height="181" alt="clip_image008" src="http://developmania.files.wordpress.com/2008/11/clip-image008-thumb.jpg?w=491&#038;h=181" width="491" border="0" /></a></p>
<p>Como se ve en el ejemplo anterior, con estos métodos, el programador tiene un control muy preciso sobre la información que desea escribir en el archivo, tanto, que hasta puede llegar a ser engorroso en algunas ocasiones.</p>
<p>Afortunadamente, la plataforma .NET ofrece otras maneras de administrar Streams para hacerle la vida más fácil al desarrollador. Una de esas maneras es utilizar la clase StreamWriter para escribir en archivos y StreamReader para leer desde archivos. Es necesario tener en cuenta que estas clases están orientadas a obtener caracteres como salida a diferencia de las clases que heredan de Stream que están orientadas a obtener bytes.</p>
<p>Con la clase StreamWriter, solo nos debemos preocupar por utilizar el método Write o WriteLine para escribir datos en un archivo de texto. Estos métodos reciben tipos de datos nativos del lenguaje como por ejemplo int, bool, decimal, float, string, char, etc. Y utiliza el codificador indicado cuando se instancia la clase para codificar los caracteres de salida al archivo de texto. En caso de utilizar un constructor que no especifique algún Encoding, por defecto esta clase opera con el UTF8.</p>
<p><a href="http://developmania.files.wordpress.com/2008/11/clip-image010.jpg"><img title="clip_image010" style="border-right:0;border-top:0;display:inline;border-left:0;border-bottom:0;" height="61" alt="clip_image010" src="http://developmania.files.wordpress.com/2008/11/clip-image010-thumb.jpg?w=496&#038;h=61" width="496" border="0" /></a></p>
<p>Como se ve en el ejemplo anterior, las líneas de código son mucho mas sencillas que las vistas en el ejemplo del FileStream. Esto es porque la clase StreamWriter es una clase especializadas para el trabajo de Stream hacia archivos de texto y nos evita el trabajo de tener que obtener la representación en bytes del valor que queramos escribir. </p>
<p>La diferencia entre el método Write y WriteLine, es que el segundo inserta un salto de línea al final de los datos ingresados, haciendo que la próxima vez que se quiera insertar, se hará en la siguiente línea.</p>
<p>Aunque la clase StreamWriter no hereda de la clase Stream, si utiliza en su implementación un Stream en el cual escribe o lee secuencias de caracteres. Por eso, esta clase en su interior, se encarga de crear y utilizar el Stream necesario para apuntar al archivo de texto representado por la ruta que se utilizo en el constructor del ejemplo. Sin embargo, esta clase también tiene otro constructor donde se le puede pasar un Stream que tengamos creado en lugar de la ruta, como se ve a continuación:</p>
<p><a href="http://developmania.files.wordpress.com/2008/11/clip-image012.jpg"><img title="clip_image012" style="border-right:0;border-top:0;display:inline;border-left:0;border-bottom:0;" height="63" alt="clip_image012" src="http://developmania.files.wordpress.com/2008/11/clip-image012-thumb.jpg?w=492&#038;h=63" width="492" border="0" /></a></p>
<p>El complemento del objeto StreamWriter es el objeto StreamReader, cuyo principal objetivo es facilitarnos las tareas de lectura de cadenas de caracteres. Con este objeto, nos podemos despreocupar de esas tareas de bajo nivel para poder obtener un código mucho mas limpio y fácilmente legible.</p>
<p><a href="http://developmania.files.wordpress.com/2008/11/clip-image014.gif"><img title="clip_image014" style="border-right:0;border-top:0;display:inline;border-left:0;border-bottom:0;" height="52" alt="clip_image014" src="http://developmania.files.wordpress.com/2008/11/clip-image014-thumb.gif?w=428&#038;h=52" width="428" border="0" /></a></p>
<p>En el ejemplo se ve como fácilmente se puede leer información de un archivo de texto utilizando el método ReadLine del objeto StreamReader. Este método, simplemente lee la línea siguiente teniendo en cuenta la posición actual del puntero del archivo.</p>
<p>Es importante aclarar que utilizando los streams vistos hasta el momento se pueden leer y escribir en archivos de texto cadenas de caracteres, es decir, texto plano. Esto implica que la información escrita en los archivos podrá ser vista y entendida por cualquier persona, ya que se guarda tal y como se encuentra en un principio. </p>
<p>Lo anterior puede llegar a ser un problema en los casos en que se elige utilizar archivos de texto como repositorio de datos de una aplicación (aunque esto es poco recomendable, habrán casos en los pueda llegar a ser necesario), y digo que es un problema porque podría haber información que no queremos que cualquier persona la pueda ver y mucho menos entender, sino que quisiéramos que dicha información estuviera almacenada de forma segura.</p>
<p>Una posible opción para esto es almacenando la información en formato binario, es decir, que la información estará almacenada no en formato de texto plano sino en su representación binaria (1s y 0s), lo cual permite tener mas privacidad (OJO, solo mas privacidad, no mucha privacidad ni seguridad. Si el punto fuera como obtener una forma segura de almacenar información tendríamos que mirar los temas de cifrado y hashing). En .NET, el objeto que nos facilita trabajar con Stream de datos binarios es el BinaryWriter y el BinaryReader, los cuales supongo pueden deducir como se utilizan según lo visto anteriormente.</p>
<p>El primero permite escribir datos en un archivo de texto en formato binario mediante el método Write(), el cual.tiene varias sobrecargas entre los cuales acepta varios tipos de dato como por ejemplo int, long, bool, double, decimal, char, string. El segundo permite recuperar información almacenada en formato binario por medio del método indicado. Como así que por medio del método indicado?. Lo que sucede con el BinaryReader es que no tiene un método Read genérico, sino que tiene un Read para cada tipo de dato que puede ser escrito, por ejemplo ReadInt32, ReadBoolean, ReadChar, etc. Esto nos obliga a conocer la estructura del archivo con el que estamos trabajando para poder leer el tipo de dato correcto en la posición correcta.</p>
<p>A continuación se muestra un pequeño ejemplo sobre como utilizar el BinaryReader y el BinaryWriter.</p>
<p><a href="http://developmania.files.wordpress.com/2008/11/clip-image016.gif"><img title="clip_image016" style="border-right:0;border-top:0;display:inline;border-left:0;border-bottom:0;" height="196" alt="clip_image016" src="http://developmania.files.wordpress.com/2008/11/clip-image016-thumb.gif?w=444&#038;h=196" width="444" border="0" /></a></p>
<p>En el ejemplo anterior se observa como se puede escribir varios tipos de dato con el mismo método Write del objeto BinaryWriter ya que tiene varias sobrecargas.</p>
<p>A continuación se muestra como se vería la información en el caso de intentar visualizarla con un editor de texto:</p>
<p><a href="http://developmania.files.wordpress.com/2008/11/clip-image018.gif"><img title="clip_image018" style="border-right:0;border-top:0;display:inline;border-left:0;border-bottom:0;" height="150" alt="clip_image018" src="http://developmania.files.wordpress.com/2008/11/clip-image018-thumb.gif?w=372&#038;h=150" width="372" border="0" /></a></p>
<p>Para leer información binaria se utiliza el objeto BinaryReader y se utiliza “El método indicado”.</p>
<p><a href="http://developmania.files.wordpress.com/2008/11/clip-image020.gif"><img title="clip_image020" style="border-right:0;border-top:0;display:inline;border-left:0;border-bottom:0;" height="130" alt="clip_image020" src="http://developmania.files.wordpress.com/2008/11/clip-image020-thumb.gif?w=430&#038;h=130" width="430" border="0" /></a></p>
<p>En el ejemplo anterior se observa como se utiliza el método de lectura según el tipo de dato que desee leer, lo cual implica que con anterioridad se conozca la estructura del archivo. En este caso, nótese que se leyó exactamente en el mismo orden en el que se escribió la información con el BinaryWriter.</p>
<p>El siguiente es el resultado de la ejecución del código anterior:</p>
<p><a href="http://developmania.files.wordpress.com/2008/11/clip-image022.gif"><img title="clip_image022" style="border-right:0;border-top:0;display:inline;border-left:0;border-bottom:0;" height="96" alt="clip_image022" src="http://developmania.files.wordpress.com/2008/11/clip-image022-thumb.gif?w=361&#038;h=96" width="361" border="0" /></a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/developmania.wordpress.com/161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/developmania.wordpress.com/161/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/developmania.wordpress.com/161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/developmania.wordpress.com/161/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/developmania.wordpress.com/161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/developmania.wordpress.com/161/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/developmania.wordpress.com/161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/developmania.wordpress.com/161/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/developmania.wordpress.com/161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/developmania.wordpress.com/161/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/developmania.wordpress.com/161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/developmania.wordpress.com/161/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/developmania.wordpress.com/161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/developmania.wordpress.com/161/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=developmania.wordpress.com&amp;blog=3736555&amp;post=161&amp;subd=developmania&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://developmania.wordpress.com/2008/11/14/lectura-y-escritura-de-archivos-en-c/feed/</wfw:commentRss>
		<slash:comments>50</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">fzapataramirez</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2008/11/clip-image002-thumb.jpg" medium="image">
			<media:title type="html">clip_image002</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2008/11/clip-image004-thumb.jpg" medium="image">
			<media:title type="html">clip_image004</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2008/11/clip-image006-thumb.jpg" medium="image">
			<media:title type="html">clip_image006</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2008/11/clip-image008-thumb.jpg" medium="image">
			<media:title type="html">clip_image008</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2008/11/clip-image010-thumb.jpg" medium="image">
			<media:title type="html">clip_image010</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2008/11/clip-image012-thumb.jpg" medium="image">
			<media:title type="html">clip_image012</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2008/11/clip-image014-thumb.gif" medium="image">
			<media:title type="html">clip_image014</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2008/11/clip-image016-thumb.gif" medium="image">
			<media:title type="html">clip_image016</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2008/11/clip-image018-thumb.gif" medium="image">
			<media:title type="html">clip_image018</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2008/11/clip-image020-thumb.gif" medium="image">
			<media:title type="html">clip_image020</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2008/11/clip-image022-thumb.gif" medium="image">
			<media:title type="html">clip_image022</media:title>
		</media:content>
	</item>
		<item>
		<title>Colecciones de datos en C#.NET (Parte V: Colecciones Gen&#233;ricas)</title>
		<link>http://developmania.wordpress.com/2008/10/07/colecciones-de-datos-en-cnet-parte-v-colecciones-genricas/</link>
		<comments>http://developmania.wordpress.com/2008/10/07/colecciones-de-datos-en-cnet-parte-v-colecciones-genricas/#comments</comments>
		<pubDate>Wed, 08 Oct 2008 02:25:15 +0000</pubDate>
		<dc:creator>fzapataramirez</dc:creator>
				<category><![CDATA[Programación(Básica)]]></category>
		<category><![CDATA[Colecciones]]></category>
		<category><![CDATA[colecciones genericas]]></category>
		<category><![CDATA[Generics]]></category>
		<category><![CDATA[generics en .NET]]></category>
		<category><![CDATA[System.Collections.Generics]]></category>

		<guid isPermaLink="false">http://developmania.wordpress.com/2008/10/07/colecciones-de-datos-en-cnet-parte-v-colecciones-genricas/</guid>
		<description><![CDATA[A diferencia de las colecciones de datos tratadas en los post anteriores, las colecciones genéricas se encuentran en el namespace System.Collections.Generics ya que son colecciones con la misma funcionalidad que las colecciones no genéricas (las normales, las que están en el namespace System.Collections), con la diferencia que estas están orientadas a trabajar con un tipo [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=developmania.wordpress.com&amp;blog=3736555&amp;post=135&amp;subd=developmania&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p align="justify">A diferencia de las colecciones de datos tratadas en los post anteriores, las colecciones genéricas se encuentran en el namespace System.Collections.Generics ya que son colecciones con la misma funcionalidad que las colecciones no genéricas (las normales, las que están en el namespace System.Collections), con la diferencia que estas están orientadas a trabajar con un tipo de dato especifico.</p>
<p align="justify">
<p align="justify">Con un tipo de dato especifico?. Si así es, porque a diferencia de las colecciones no genéricas en las que se pueden agregar cualquier tipo de elementos y todos son convertidos a System.Object, en este tipo de colecciones solo es posible almacenar elementos de un tipo de dato específico.</p>
<p align="justify">
<p align="justify">Cuando comencé a leer sobre esta nueva característica ofrecida por el Framework 2.0, me preguntaba si el nombre verdaderamente correspondía a la definición de estas colecciones, ya que no entendía el porque llamarlas genéricas si solo era posible almacenar datos del mismo tipo. Por el contrario, parecían ser más genéricas las otras colecciones (las del namespace System.Collections) ya que me permitían almacenar cualquier tipo de dato.</p>
<p align="justify">
<p align="justify">Pero finalmente y después de leer varios artículos y códigos de ejemplo, comprendí el porque del nombre generics y espero poder transmitirlo en este post.</p>
<p align="justify">
<p align="justify">Definitivamente, una colección genérica solo puede almacenar datos de un tipo, pero dicho tipo de dato es definido por nosotros mismos al momento de declararla e instanciarla. Es decir, no hay una clase para diferenciar las colecciones que operan con enteros de las que operan con cadenas de texto ni de las que operan objetos de tipo Empleado (por ejemplo). Absolutamente todas están definidas en la misma clase, lo único que las diferencia es la manera en que se instancia y se declara cada una de ellas. Ese es el secreto del ser genérica. Para entender mejor el concepto de la colección genérica, veamos el siguiente ejemplo:</p>
<p align="justify">
<p align="justify"><a href="http://developmania.files.wordpress.com/2008/10/clip-image002.jpg"><img style="border-right:0;border-top:0;border-left:0;border-bottom:0;" src="http://developmania.files.wordpress.com/2008/10/clip-image002-thumb.jpg?w=362&#038;h=78" border="0" alt="clip_image002" width="362" height="78" /></a></p>
<p align="justify">
<p align="justify">En el ejemplo se observa la implementación de la colección genérica List, que es la versión genérica del ArrayList tratado en un post anterior. Se puede deducir que la primera colección permitirá almacenar únicamente datos de tipo int, que la segunda almacenara solo cadenas de texto y que la última almacenara objetos de tipo TablaDatos, el cual es un tipo definido en una clase aparte. En las definición de las tres colecciones se utilizo la clase List, es decir, que hay una clase “genérica” capaz de trabajar con el tipo de dato que indiquemos al momento de inicializarla. (Realmente no es cualquier tipo de dato, sino los tipos de datos soportados por la clase).</p>
<p align="justify">
<p align="justify">La diferencia para inicializar una clase genérica de una clase no genérica, es que en la primera se debe utilizar una parámetro adicional después del nombre de la clase y entre los caracteres &lt; y &gt;. Este parámetro debe ser un tipo de datos, que indica el tipo de datos con el que la colección deberá operar.</p>
<p align="justify">
<p align="justify">Así como esta la colecciones List&lt;T&gt;, que es la versión genérica del ArrayList, también existen las colecciones genéricas Stack&lt;T&gt;, Queue&lt;T&gt; y Dictionary&lt;T&gt;, entre otras que son las versiones genéricas de las clases Snack, Queue y HashTable respectivamente.</p>
<p align="justify">
<p align="justify">Un ejemplo de la clase genérica de Stack seria:</p>
<p align="justify">
<p align="justify"><a href="http://developmania.files.wordpress.com/2008/10/clip-image004.jpg"><img style="border-right:0;border-top:0;border-left:0;border-bottom:0;" src="http://developmania.files.wordpress.com/2008/10/clip-image004-thumb.jpg?w=301&#038;h=73" border="0" alt="clip_image004" width="301" height="73" /></a></p>
<p align="justify">
<p align="justify">Se puede ver como se define una pila en la que únicamente se pueden almacenar datos de tipo entero, lo cual me permite obtener datos de la colección y tratarlos directamente como enteros sin necesidad de hacer algún tipo de cast, lo cual no seria posible con las colecciones no genéricas ya que el elemento es almacenado como un System.Object.</p>
<p align="justify">
<p align="justify">El hecho de que las colecciones genéricas operen con un tipo de dato definido en el momento de su declaración, las hace mucho más eficientes, ya que evita tener que realizar boxing, unboxing y casting de objetos. Adicionalmente los desarrolladores, obtienen un mayor grado de control sobre la información almacenada en la colección ya que en caso de intentar ingresar un objeto de un tipo de dato diferente al establecido en la inicialización de la colección, se arroja una excepción.</p>
<p align="justify">
<p align="justify">Además de esta ventaja que nos brindan las colecciones genéricas, tenemos la posibilidad de crear nuestras propias clases y métodos genérico cuyo comportamiento estará ligado al tipo de dato que se utilice al utilizarlo tal y como sucede con las colecciones. Para lograr esto debemos hacer uso de los “type parameters”, los cuales permiten establecer un parámetro cuyo tipo se desconocerá hasta que se indique en la declaración.</p>
<p align="justify">
<p align="justify">Para comprender mejor el funcionamiento de los “type parameters” que nos permiten crear clases genéricas, he desarrollado una aplicación de muestra que consiste en una clase impresora “genérica”, que es capaz de almacenar en una cola, objetos de un tipo específico (del tipo que se define al momento de definir un objeto de esta clase). Adicionalmente expone un método “imprimir” que se encarga de imprimir en pantalla cada uno de los valores contenidos en la cola. A continuación presento los fragmentos principales del código.</p>
<p align="justify">
<p align="justify"><a href="http://developmania.files.wordpress.com/2008/10/clip-image006.jpg"><img style="border-right:0;border-top:0;border-left:0;border-bottom:0;" src="http://developmania.files.wordpress.com/2008/10/clip-image006-thumb.jpg?w=474&#038;h=239" border="0" alt="clip_image006" width="474" height="239" /></a></p>
<p align="justify">
<p align="justify">En esta primera imagen, se observa como se ha definido una clase Impresora genérica. Note que en este caso se utiliza la letra T para representar el “type parameter”, sin embargo es posible utilizar cualquier letra o palabra. Mediante este parámetro estamos indicando que al momento de definir e instanciar un objeto de tipo Impresora, se debe pasar como parámetro entre &lt; y &gt; el tipo de datos con el que se desea trabajar.</p>
<p align="justify">En el constructor de esta clase, se puede ver como la Queue genérica que tiene la clase Impresora como atributo toma su mismo tipo de dato, es decir, si al crear la clase Impresora indicamos el tipo de dato int, la Queue también tomara el tipo de dato int.</p>
<p align="justify">
<p align="justify"><a href="http://developmania.files.wordpress.com/2008/10/clip-image008.jpg"><img style="border-right:0;border-top:0;border-left:0;border-bottom:0;" src="http://developmania.files.wordpress.com/2008/10/clip-image008-thumb.jpg?w=427&#038;h=315" border="0" alt="clip_image008" width="427" height="315" /></a></p>
<p align="justify">
<p align="justify">En esta segunda imagen se observa una propiedad que retorna una cola genérica, pero el type parameter para indicar que es una Queue genérica es el mismo utilizado en nuestra clase Impresora, lo cual indica que retornara una Queue del tipo de dato utilizado en la clase.</p>
<p align="justify">Finalmente se observa el método imprimir, cuyo objetivo es indicar el tipo de Queue que se esta imprimiendo y además mostrar cada uno de los elementos que contiene.</p>
<p align="justify">
<p align="justify">Como paso final, para comprobar el funcionamiento de la clase Impresora, se crea un objeto de tipo Impresora de enteros, así:</p>
<p align="justify">
<p align="justify"><a href="http://developmania.files.wordpress.com/2008/10/clip-image010.jpg"><img style="border-right:0;border-top:0;border-left:0;border-bottom:0;" src="http://developmania.files.wordpress.com/2008/10/clip-image010-thumb.jpg?w=408&#038;h=182" border="0" alt="clip_image010" width="408" height="182" /></a></p>
<p align="justify">
<p align="justify">Otra de las ventajas que nos brinda la utilización de Generics, es que los “type parameters” se traducen en tiempo de compilación, lo cual implica que es posible darnos cuenta en el momento que desarrollamos nuestra aplicación, el tipo de datos con el que se esta trabajando en cada instancia de la clase Impresora, como se ve a continuación:</p>
<p align="justify">
<p align="justify"><a href="http://developmania.files.wordpress.com/2008/10/clip-image012.jpg"><img style="border-right:0;border-top:0;border-left:0;border-bottom:0;" src="http://developmania.files.wordpress.com/2008/10/clip-image012-thumb.jpg?w=448&#038;h=106" border="0" alt="clip_image012" width="448" height="106" /></a></p>
<p align="justify">
<p align="justify">
<p align="justify">Finalmente, se observa el resultado de la ejecución de la aplicación en consola:</p>
<p align="justify">
<p align="justify"><a href="http://developmania.files.wordpress.com/2008/10/clip-image014.jpg"><img style="border-right:0;border-top:0;border-left:0;border-bottom:0;" src="http://developmania.files.wordpress.com/2008/10/clip-image014-thumb.jpg?w=431&#038;h=150" border="0" alt="clip_image014" width="431" height="150" /></a></p>
<p align="justify">
<p align="justify">
<p align="justify">
<p align="justify">
<p align="justify">
<p align="justify">
<p align="justify">En conclusión, debemos utilizar las colecciones genéricas tanto como sea posible en lugar de utilizar las colecciones no genéricas, ya que las primeras incrementan el rendimiento de la aplicación ya que evita un sin numero de casting, boxing y unboxing lo que permite realizar un mejor manejo de la memoria y procesamiento.</p>
<p align="justify">
<p align="justify">Además podemos crear propias clases y/o métodos genéricos para aumentar la flexibilidad y la posibilidad de reutilizar nuestro código.</p>
<p align="justify">
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/developmania.wordpress.com/135/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/developmania.wordpress.com/135/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/developmania.wordpress.com/135/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/developmania.wordpress.com/135/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/developmania.wordpress.com/135/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/developmania.wordpress.com/135/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/developmania.wordpress.com/135/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/developmania.wordpress.com/135/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/developmania.wordpress.com/135/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/developmania.wordpress.com/135/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/developmania.wordpress.com/135/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/developmania.wordpress.com/135/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/developmania.wordpress.com/135/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/developmania.wordpress.com/135/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=developmania.wordpress.com&amp;blog=3736555&amp;post=135&amp;subd=developmania&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://developmania.wordpress.com/2008/10/07/colecciones-de-datos-en-cnet-parte-v-colecciones-genricas/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">fzapataramirez</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2008/10/clip-image002-thumb.jpg" medium="image">
			<media:title type="html">clip_image002</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2008/10/clip-image004-thumb.jpg" medium="image">
			<media:title type="html">clip_image004</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2008/10/clip-image006-thumb.jpg" medium="image">
			<media:title type="html">clip_image006</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2008/10/clip-image008-thumb.jpg" medium="image">
			<media:title type="html">clip_image008</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2008/10/clip-image010-thumb.jpg" medium="image">
			<media:title type="html">clip_image010</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2008/10/clip-image012-thumb.jpg" medium="image">
			<media:title type="html">clip_image012</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2008/10/clip-image014-thumb.jpg" medium="image">
			<media:title type="html">clip_image014</media:title>
		</media:content>
	</item>
		<item>
		<title>Colecciones de datos en C#.NET (Parte IV: HashTable)</title>
		<link>http://developmania.wordpress.com/2008/09/14/colecciones-de-datos-en-cnet-parte-iv-hashtable/</link>
		<comments>http://developmania.wordpress.com/2008/09/14/colecciones-de-datos-en-cnet-parte-iv-hashtable/#comments</comments>
		<pubDate>Sun, 14 Sep 2008 14:21:28 +0000</pubDate>
		<dc:creator>fzapataramirez</dc:creator>
				<category><![CDATA[Programación(Básica)]]></category>
		<category><![CDATA[coleccion]]></category>
		<category><![CDATA[hash]]></category>
		<category><![CDATA[hashtable]]></category>
		<category><![CDATA[key]]></category>

		<guid isPermaLink="false">http://developmania.wordpress.com/2008/09/14/colecciones-de-datos-en-cnet-parte-iv-hashtable/</guid>
		<description><![CDATA[Una tabla hash o Hash Table, es una colección que permite almacenar pares de objetos, donde el primero es conocido como llave (key) y el segundo es conocido como valor (value). De esta manera, para agregar &#8220;un&#8221; elemento a la colección, siempre se debe pasar como argumento estos dos objetos. Una de las ventajas que [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=developmania.wordpress.com&amp;blog=3736555&amp;post=117&amp;subd=developmania&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p align="justify">Una tabla hash o Hash Table, es una colección que permite almacenar pares de objetos, donde el primero es conocido como llave (key) y el segundo es conocido como valor (value). De esta manera, para agregar &#8220;un&#8221; elemento a la colección, siempre se debe pasar como argumento estos dos objetos.</p>
<p><a href="http://developmania.files.wordpress.com/2008/09/image.png"><img style="border-width:0;" src="http://developmania.files.wordpress.com/2008/09/image-thumb.png?w=291&#038;h=54" border="0" alt="image" width="291" height="54" /></a></p>
<p align="justify">Una de las ventajas que presenta ésta colección frente a las colecciones mencionadas anteriormente (<a href="http://developmania.wordpress.com/2008/08/09/colecciones-de-datos-en-cnet-parte-i-vectores/" target="_blank">Parte I: Vectores</a>, <a href="http://developmania.wordpress.com/2008/08/23/colecciones-de-datos-en-cnet-parte-ii-arraylist/" target="_blank">Parte II: ArrayList</a>, <a href="http://developmania.wordpress.com/2008/08/29/colecciones-de-datos-en-cnet-parte-iii-stack-queue/" target="_blank">Parte III: Stack y Queue</a>),<span style="color:#ff8040;"> </span><span style="color:#4b5d67;">es el poco tiempo que tarda en realizar la búsqueda de un elemento determinado, debido a que utiliza el hash de las llaves (keys) para ordenar los elementos, permitiendo así, tener una ubicación única para cada uno.</span></p>
<p align="justify">Un Hash consiste en pocas palabras, en un código único generado por una función Hash, la cual genera una salida única para entradas diferentes y además, produce la misma salida para entradas iguales. Por estas características de una función Hash, no pueden haber llaves iguales en la tabla Hash ya que esto produciría el mismo Hash y no seria posible diferenciar unívocamente los elementos de la colección.</p>
<p align="justify">El comportamiento de la HashTable se puede comparar a una tabla de una base de datos relacional, donde cada tabla generalmente (en este caso obligatoriamente) tiene una llave primaria por medio de la cual se diferencia cada registro de los demás y que además su valor debe ser único en toda la tabla. De la misma manera se comporta la HashTable ya que los elementos son ordenados según su Hash.</p>
<p align="justify">Cuando sea necesario obtener uno de los elementos contenidos en la HashTable, se debe utilizar la llave o key con la que fue almacenada, como se muestra a continuación:</p>
<p align="justify"><a href="http://developmania.files.wordpress.com/2008/09/image1.png"><img style="border-width:0;" src="http://developmania.files.wordpress.com/2008/09/image-thumb1.png?w=441&#038;h=78" border="0" alt="image" width="441" height="78" /></a></p>
<p align="justify"><a href="http://developmania.files.wordpress.com/2008/09/image2.png"><img style="border-width:0;" src="http://developmania.files.wordpress.com/2008/09/image-thumb2.png?w=323&#038;h=52" border="0" alt="image" width="323" height="52" /></a></p>
<p align="justify">Siempre que se referencia la HashTable utilizando una Key, será retornado el valor correspondiente a dicha clave en un objeto de tipo Object, por lo que es importante convertir el dato obtenido al tipo de dato adecuado para evitar generar excepciones.<br />
Lo anterior, permite tener en la colección pares de llaves y valor que pertenezcan a tipos de datos diferentes, es decir, nada nos obliga a que todos los elementos del HashTable sean del mismo tipo. Incluso las llaves (keys) y los valores (values), pueden ser de tipos de datos diferentes entre si. Sin embargo, no es muy recomendable utilizar la HashTable de esta manera, ya que eso implicaría conocer exactamente que elementos están incluidos en la HashTable e implicaría tener mucho mas cuidado a la hora de extraer los datos, lo cual impediría que la aplicación sea flexible y escalable.</p>
<p align="justify"><a href="http://developmania.files.wordpress.com/2008/09/image3.png"><img style="border-width:0;" src="http://developmania.files.wordpress.com/2008/09/image-thumb3.png?w=488&#038;h=141" border="0" alt="image" width="488" height="141" /></a></p>
<p align="justify"><a href="http://developmania.files.wordpress.com/2008/09/image4.png"><img style="border-width:0;" src="http://developmania.files.wordpress.com/2008/09/image-thumb4.png?w=323&#038;h=56" border="0" alt="image" width="323" height="56" /></a></p>
<p align="justify">En el ejemplo anterior se ve como se puede ingresar llaves y valores de diferentes tipos de datos. Además se puede ver como es posible ingresar un valor de tipo null, lo cual no es posible hacerlo en una de las llaves ya que se generaría la excepción ArgumentNullException.</p>
<p align="justify">Utilizando la sintaxis &#8220;[key]&#8221; (por ejemplo: tabla["llave texto"]) sobre una tabla Hash, es posible actualizar el valor contenido o en caso de que la llave utilizada no exista en la tabla, se inserta este nuevo elemento.</p>
<p align="justify"><a href="http://developmania.files.wordpress.com/2008/09/image5.png"><img style="border-width:0;" src="http://developmania.files.wordpress.com/2008/09/image-thumb5.png?w=315&#038;h=79" border="0" alt="image" width="315" height="79" /></a></p>
<p align="justify">La clase HashTable pertenece al espacio de nombres System.Collections e implementa las colecciones IEnumerable, ICollection, entre otras. Debido a esto, es posible utilizar la instrucción foreach para leer datos de una HashTable. Sin embargo, en cada iteracion de esta instrucción, se debe operar con un objeto de tipo DictionaryEntry que contendrá un par llave/valor.</p>
<p align="justify"><a href="http://developmania.files.wordpress.com/2008/09/image6.png"><img style="border-width:0;" src="http://developmania.files.wordpress.com/2008/09/image-thumb6.png?w=381&#038;h=56" border="0" alt="image" width="381" height="56" /></a></p>
<p align="justify">Algunos de los métodos mas utilizados de la clase HashTable son:</p>
<p align="justify"><strong>Add</strong>: permite agregar un nuevo par llave/valor a la colección.</p>
<p align="justify"><strong>Remove</strong>: permite quitar un par llave/valor de la colección</p>
<p align="justify"><strong>ContainsKey:</strong> permite saber si la colección contiene un par cuya clave sea la que se le pasa como parámetro.</p>
<p align="justify"><strong>ContainsValue</strong>: permite saber si la colección contiene un par cuyo valor sea el que se le pasa como parámetro.</p>
<p align="justify"> </p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/developmania.wordpress.com/117/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/developmania.wordpress.com/117/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/developmania.wordpress.com/117/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/developmania.wordpress.com/117/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/developmania.wordpress.com/117/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/developmania.wordpress.com/117/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/developmania.wordpress.com/117/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/developmania.wordpress.com/117/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/developmania.wordpress.com/117/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/developmania.wordpress.com/117/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/developmania.wordpress.com/117/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/developmania.wordpress.com/117/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/developmania.wordpress.com/117/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/developmania.wordpress.com/117/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/developmania.wordpress.com/117/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/developmania.wordpress.com/117/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=developmania.wordpress.com&amp;blog=3736555&amp;post=117&amp;subd=developmania&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://developmania.wordpress.com/2008/09/14/colecciones-de-datos-en-cnet-parte-iv-hashtable/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">fzapataramirez</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2008/09/image-thumb.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2008/09/image-thumb1.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2008/09/image-thumb2.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2008/09/image-thumb3.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2008/09/image-thumb4.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2008/09/image-thumb5.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2008/09/image-thumb6.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
		<item>
		<title>Colecciones de datos en C#.NET (Parte III: Stack &amp; Queue)</title>
		<link>http://developmania.wordpress.com/2008/08/29/colecciones-de-datos-en-cnet-parte-iii-stack-queue/</link>
		<comments>http://developmania.wordpress.com/2008/08/29/colecciones-de-datos-en-cnet-parte-iii-stack-queue/#comments</comments>
		<pubDate>Fri, 29 Aug 2008 14:06:51 +0000</pubDate>
		<dc:creator>fzapataramirez</dc:creator>
				<category><![CDATA[Programación(Básica)]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Cola]]></category>
		<category><![CDATA[Pila]]></category>
		<category><![CDATA[Queue]]></category>
		<category><![CDATA[Stack]]></category>

		<guid isPermaLink="false">http://developmania.wordpress.com/2008/08/29/colecciones-de-datos-en-cnet-parte-iii-stack-queue/</guid>
		<description><![CDATA[Las pilas (Stack) y las colas (Queue) son dos colecciones muy similares entre si ya que solo varia la forma en que guardan y extraen los elementos que contienen. En ciertas cosas estas dos colecciones se parece a un ArrayList, como por ejemplo que soporta el redimensionamiento automático y que los elementos son almacenados como [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=developmania.wordpress.com&amp;blog=3736555&amp;post=97&amp;subd=developmania&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p align="justify">Las pilas (Stack) y las colas (Queue) son dos colecciones muy similares entre si ya que solo varia la forma en que guardan y extraen los elementos que contienen. En ciertas cosas estas dos colecciones se parece a un ArrayList, como por ejemplo que soporta el redimensionamiento automático y que los elementos son almacenados como objetos (System.Object). Pero también tienen algunas diferencias, como por ejemplo que no se puede cambiar su capacidad y no se puede acceder a sus elementos a través de índices</p>
<p align="justify">En algunas ocasiones, es importante tener un control sobre el orden en que los elementos son ingresados y obtenidos de la colección. Por esta razón existen las colecciones Stack y Queue. Como se menciono anteriormente, en estas colecciones NO es posible acceder aleatoriamente mediante índices a sus elementos, sino que es necesario utilizar un método encargado de extraer un elemento a la vez. Pero cual elemento?. Precisamente en la respuesta a esa pregunta radica la diferencia entre estas dos colecciones.</p>
<p align="justify">La pila (Stack), es una colección en la que todo nuevo elemento se ingresa al final de la misma, y únicamente es posible extraer el ultimo elemento de la colección. Por este comportamiento, el Stack es conocido como una colección LIFO (Last Input Fisrt Output) ya que siempre el ultimo elemento ingresado a la colección, será el primero en salir. Quizás la mejor manera de recordar el comportamiento de un Stack, es asociándolo con una &#8220;pila&#8221; de platos en donde cada plato esta encima del otro y en caso de querer ingresar un plato a la pila, lo que se debe hacer es ponerlo encima del ultimo plato. Luego cuando se quiere sacar un plato de la pila, solo podemos coger el ultimo plato.</p>
<p align="justify">La cola (Queue), tiene el comportamiento contrario a la pila. Todo nuevo elemento se agrega al principio de la colección y solo se puede extraer el ultimo elemento. Por esta razón, la cola se conoce como una colección FIFO (Fisrt Input First Output) ya que el primer elemento que ingresa a la cola es el primer elemento que sale. Para recordar este comportamiento se puede asociar la Queue con la fila que se debe hacer en un banco para realizar una consignación. En ese caso, el cajero atiende en el orden en que llegan las personas a la cola.</p>
<p align="justify">Las colecciones Stack y Queue se encuentran en el espacio de nombres System.Collections como todas las colecciones no genéricas.</p>
<p align="justify">Para implementar cada una de ellas se debe utilizar la clase Stack y Queue respectivamente y utilizar sus métodos que ofrecen la posibilidad de agregar elementos a la colección y extraer elementos según el comportamiento de la colección que se este utilizando.</p>
<p align="justify"><a href="http://developmania.files.wordpress.com/2008/08/image12.png"><img style="border-right:0;border-top:0;border-left:0;border-bottom:0;" height="118" alt="image" src="http://developmania.files.wordpress.com/2008/08/image-thumb12.png?w=210&#038;h=118" width="210" border="0"></a> </p>
<p align="justify">Como se ve en la figura anterior, para agregar elementos a una pila se debe utilizar el método Push que recibe como parámetro un Object. Mientras que en la cola se debe utilizar el método Enqueue (encolar). Ambos métodos, incrementan automáticamente la capacidad de la colección.</p>
<p align="justify">Para obtener un elemento de la colección, contamos con dos opciones diferentes:</p>
<p align="justify">1. Obtener el elemento indicado según el comportamiento de la colección sin quitarlo de la colección. Esto se logra mediante el método Peek de cada colección.</p>
<p align="justify">2. Obtener un elemento de la colección, quitándolo de la misma. Esto se logra mediante el método Pop de la pila (Stack) o el método Dequeue de la cola (Queue).</p>
<p align="justify">Ejemplo del Stack:</p>
<p align="justify"><a href="http://developmania.files.wordpress.com/2008/08/image13.png"><img style="border-right:0;border-top:0;border-left:0;border-bottom:0;" height="142" alt="image" src="http://developmania.files.wordpress.com/2008/08/image-thumb13.png?w=505&#038;h=142" width="505" border="0"></a> <br />Resultado:<br /><a href="http://developmania.files.wordpress.com/2008/08/image14.png"><img style="border-right:0;border-top:0;border-left:0;border-bottom:0;" height="121" alt="image" src="http://developmania.files.wordpress.com/2008/08/image-thumb14.png?w=350&#038;h=121" width="350" border="0"></a> </p>
<p align="justify">Ejemplo del Queue:</p>
<p align="justify"><a href="http://developmania.files.wordpress.com/2008/08/image15.png"><img style="border-right:0;border-top:0;border-left:0;border-bottom:0;" height="139" alt="image" src="http://developmania.files.wordpress.com/2008/08/image-thumb15.png?w=512&#038;h=139" width="512" border="0"></a> </p>
<p align="justify"><a href="http://developmania.files.wordpress.com/2008/08/image16.png"><img style="border-right:0;border-top:0;border-left:0;border-bottom:0;" height="115" alt="image" src="http://developmania.files.wordpress.com/2008/08/image-thumb16.png?w=353&#038;h=115" width="353" border="0"></a> </p>
<p align="justify">Este par de colecciones deben ser usadas cuando nos interesa tener control sobre el orden en que los elementos son obtenidos de las mismas. La pila se debe usar cuando queremos obtener los elementos en el orden inverso al cual fueron ingresados. Mientras que la cola debe ser utilizada cuando queremos obtener los elementos en el mismo orden que fueron ingresados.</p>
<p align="justify">
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/developmania.wordpress.com/97/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/developmania.wordpress.com/97/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/developmania.wordpress.com/97/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/developmania.wordpress.com/97/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/developmania.wordpress.com/97/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/developmania.wordpress.com/97/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/developmania.wordpress.com/97/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/developmania.wordpress.com/97/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/developmania.wordpress.com/97/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/developmania.wordpress.com/97/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/developmania.wordpress.com/97/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/developmania.wordpress.com/97/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/developmania.wordpress.com/97/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/developmania.wordpress.com/97/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/developmania.wordpress.com/97/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/developmania.wordpress.com/97/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=developmania.wordpress.com&amp;blog=3736555&amp;post=97&amp;subd=developmania&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://developmania.wordpress.com/2008/08/29/colecciones-de-datos-en-cnet-parte-iii-stack-queue/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">fzapataramirez</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2008/08/image-thumb12.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2008/08/image-thumb13.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2008/08/image-thumb14.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2008/08/image-thumb15.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2008/08/image-thumb16.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
		<item>
		<title>Colecciones de datos en C#.NET (Parte II: ArrayList)</title>
		<link>http://developmania.wordpress.com/2008/08/23/colecciones-de-datos-en-cnet-parte-ii-arraylist/</link>
		<comments>http://developmania.wordpress.com/2008/08/23/colecciones-de-datos-en-cnet-parte-ii-arraylist/#comments</comments>
		<pubDate>Sat, 23 Aug 2008 21:01:35 +0000</pubDate>
		<dc:creator>fzapataramirez</dc:creator>
				<category><![CDATA[Programación(Básica)]]></category>
		<category><![CDATA[array]]></category>
		<category><![CDATA[ArrayList]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[coleccion]]></category>
		<category><![CDATA[vector]]></category>

		<guid isPermaLink="false">http://developmania.wordpress.com/2008/08/23/colecciones-de-datos-en-cnet-parte-ii-arraylist/</guid>
		<description><![CDATA[Esta es una clase que representa una lista de datos. Es bastante parecida a la colección explicada anteriormente, con la diferencia que el ArrayList puede aumentar o disminuir su tamaño dinámicamente de una manera eficiente. Con un array de datos no era posible aumentar la capacidad del vector ya que dicho parámetro es especificado en [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=developmania.wordpress.com&amp;blog=3736555&amp;post=86&amp;subd=developmania&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p align="justify">Esta es una clase que representa una lista de datos. Es bastante parecida a la colección explicada <a href="http://developmania.wordpress.com/2008/08/09/colecciones-de-datos-en-cnet-parte-i-vectores/" target="_blank">anteriormente</a>, con la diferencia que el ArrayList puede aumentar o disminuir su tamaño dinámicamente de una manera eficiente.</p>
<p align="justify">Con un array de datos no era posible aumentar la capacidad del vector ya que dicho parámetro es especificado en el momento de crear la instancia del objeto. El ArrayList a diferencia, brinda la posibilidad de aumentar o disminuir su tamaño dinámicamente según sea necesario.</p>
<p align="justify">Para crear una instancia de este objeto, se debe utilizar la clase ArrayList incluida en el espacio de nombre System.Collections como se muestra a continuación.</p>
<p align="justify"><span style="color:#008080;">ArrayList</span> arrayList=<span style="color:#0000ff;">new</span> <span style="color:#408080;">ArrayList</span>();</p>
<p align="justify">El constructor de la clase ArrayList acepta también un parámetro tipo entero que indica la capacidad inicial del objeto que se esta creando.</p>
<p align="justify">Si es necesario agregar un objeto a la colección, se debe utilizar el método Add, el cual inserta el nuevo elemento en la última posición, o el método Insert el cual lo inserta en la posición indicada.</p>
<p align="justify"><a href="http://developmania.files.wordpress.com/2008/08/image8.png"><img style="border-right:0;border-top:0;border-left:0;border-bottom:0;" src="http://developmania.files.wordpress.com/2008/08/image-thumb8.png?w=321&#038;h=209" border="0" alt="image" width="321" height="209" /></a></p>
<p align="justify">Todos los objetos almacenados en un Arraylist son tratados como objetos, por lo tanto es posible agregar todo tipo de datos, es decir, se puede agregar enteros, cadenas de texto, objetos de clases propias, etc. Y a diferencia de los array vistos en la parte I, no todos los elementos deben ser del mismo tipo de dato. Esto en algunas ocasiones puede ser una ventaja ya que permite almacenar gran variedad de información en una sola colección, sin embargo, por razones de rendimiento (cast, boxing, unboxing), hay ocasiones en las que es preferible utilizar las colecciones genéricas que serán tratadas mas adelante.</p>
<p align="justify">Si es necesario quitar elementos de la colección, se debe usar el método remove, removeAt o RemoveRange, los cuales eliminan el objeto pasado como parámetro, o un elemento en una posición especifica, o un grupo de elementos respectivamente.</p>
<p align="justify">Las propiedades mas utilizadas de esta colección son : Count y Capacity. La primera sirve para conocer la cantidad actual de elementos que contiene la colección. La segunda indica la capacidad máxima actual de la colección para almacenar elementos. Es necesario tener presente que la capacidad de la colección, aumenta en caso de ser necesario al insertar un elemento, con lo que se garantiza el redimensionamiento automático.</p>
<p align="justify">La capacidad de una colección nunca podrá ser menor a la cantidad total de elementos contenidos, por lo que si se modifica manualmente la propiedad Capacity y se le asigna un valor menor que el valor devuelto por la propiedad Count, obtendremos una excepción de tipo ArgumentOutOfRangeExcepetion .</p>
<p align="justify">A continuación se muestra un ejemplo del uso de estas propiedades:</p>
<p align="justify"><a href="http://developmania.files.wordpress.com/2008/08/image9.png"><img style="border-right:0;border-top:0;border-left:0;border-bottom:0;" src="http://developmania.files.wordpress.com/2008/08/image-thumb9.png?w=490&#038;h=269" border="0" alt="image" width="490" height="269" /></a></p>
<p align="justify"><a href="http://developmania.files.wordpress.com/2008/08/image10.png"><img style="border-right:0;border-top:0;border-left:0;border-bottom:0;" src="http://developmania.files.wordpress.com/2008/08/image-thumb10.png?w=339&#038;h=107" border="0" alt="image" width="339" height="107" /></a></p>
<p align="justify">Para acceder a los elementos contenidos por la colección se puede hacer mediante el uso de índices o mediante la instrucción foreach.</p>
<p align="justify"><a href="http://developmania.files.wordpress.com/2008/08/image11.png"><img style="border-right:0;border-top:0;border-left:0;border-bottom:0;" src="http://developmania.files.wordpress.com/2008/08/image-thumb11.png?w=287&#038;h=136" border="0" alt="image" width="287" height="136" /></a></p>
<p align="justify">Determinar que tipo de colección usar en un caso especifico, es tarea del desarrollado y se debe evaluar las condiciones para determinar la manera mas eficiente de administrar los recursos. Si es un escenario donde no conocemos el tamaño que tendrá la colección y si además será muy probable que el tamaño varíe, entonces será recomendable bajo todas las demás circunstancias usar un ArrayList en lugar de un array debido a que el ArrayList brinda la posibilidad de redimensionarlo automáticamente. Sin embargo, para escenarios donde se conoce de antemano la cantidad total de elementos a almacenar y si todos son del mismo tipo, se debe usar el array convencional ya que los objetos son almacenados en su tipo de datos nativo y no es necesario hacer conversiones.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/developmania.wordpress.com/86/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/developmania.wordpress.com/86/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/developmania.wordpress.com/86/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/developmania.wordpress.com/86/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/developmania.wordpress.com/86/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/developmania.wordpress.com/86/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/developmania.wordpress.com/86/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/developmania.wordpress.com/86/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/developmania.wordpress.com/86/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/developmania.wordpress.com/86/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/developmania.wordpress.com/86/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/developmania.wordpress.com/86/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/developmania.wordpress.com/86/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/developmania.wordpress.com/86/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/developmania.wordpress.com/86/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/developmania.wordpress.com/86/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=developmania.wordpress.com&amp;blog=3736555&amp;post=86&amp;subd=developmania&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://developmania.wordpress.com/2008/08/23/colecciones-de-datos-en-cnet-parte-ii-arraylist/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">fzapataramirez</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2008/08/image-thumb8.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2008/08/image-thumb9.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2008/08/image-thumb10.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2008/08/image-thumb11.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
		<item>
		<title>Colecciones de datos en C#.NET (Parte I &#8211; Vectores)</title>
		<link>http://developmania.wordpress.com/2008/08/09/colecciones-de-datos-en-cnet-parte-i-vectores/</link>
		<comments>http://developmania.wordpress.com/2008/08/09/colecciones-de-datos-en-cnet-parte-i-vectores/#comments</comments>
		<pubDate>Sat, 09 Aug 2008 16:37:34 +0000</pubDate>
		<dc:creator>fzapataramirez</dc:creator>
				<category><![CDATA[Programación(Básica)]]></category>
		<category><![CDATA[Colecciones]]></category>

		<guid isPermaLink="false">http://developmania.wordpress.com/2008/08/09/colecciones-de-datos-en-cnet-parte-i-vectores/</guid>
		<description><![CDATA[Como lo explique en un post anterior, las colecciones de datos son algunas de las herramientas mas utilizadas a la hora de desarrollar una aplicaci&#243;n ya que nos permiten manipular informaci&#243;n en memoria de una manera f&#225;cil y flexible. La plataforma .NET ofrece una gran variedad de colecciones que debemos conocer y saber utilizar para [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=developmania.wordpress.com&amp;blog=3736555&amp;post=77&amp;subd=developmania&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Como lo explique en un <a href="http://developmania.wordpress.com/2008/07/30/colecciones-de-datos/" target="_blank">post anterior</a>, las colecciones de datos son algunas de las herramientas mas utilizadas a la hora de desarrollar una aplicaci&#243;n ya que nos permiten manipular informaci&#243;n en memoria de una manera f&#225;cil y flexible.</p>
<p>La plataforma .NET ofrece una gran variedad de colecciones que debemos conocer y saber utilizar para emplear la mas indicada en nuestras aplicaciones y obtener as&#237; el mejor rendimiento posible tanto en procesamiento como en manejo de memoria. A continuaci&#243;n se explican algunas de las colecciones incluidas en el lenguaje C#.NET.</p>
<h2></h2>
<p>La clase Array, contenida en el namespace System, provee toda la funcionalidad necesaria en las colecciones para manipular los datos. Esta es una clase abstracta, por lo cual no es posible crear instancias de la misma, sino que sirve como clase base (de la que otras clases heredan) para las dem&#225;s clases que representan colecciones en .NET</p>
<p>La colecci&#243;n mas sencilla que utiliza como clase base System.Array, es lo que se conoce com&#250;nmente como vector. Para definir un vector, debemos tener claro que tipo de dato queremos que nuestro vector almacene y la cantidad de valores que deseamos almacenar ya que son requisitos indispensables para la definici&#243;n y creaci&#243;n de vectores.    <br />En C#, un vector se define con un par de corchetes [] despu&#233;s del tipo de dato, como se muestra a continuaci&#243;n.</p>
<p><a href="http://developmania.files.wordpress.com/2008/08/image.png"><img style="border-width:0;" height="44" alt="image" src="http://developmania.files.wordpress.com/2008/08/image-thumb.png?w=145&#038;h=44" width="145" border="0" /></a> </p>
<p>Sin embargo, para hacer uso de nuestro vector, debemos primero crear la instancia declarando cuantas posiciones m&#225;ximas tendr&#225;, como se muestra a continuaci&#243;n:</p>
<p><a href="http://developmania.files.wordpress.com/2008/08/image1.png"><img style="border-width:0;" height="53" alt="image" src="http://developmania.files.wordpress.com/2008/08/image-thumb1.png?w=212&#038;h=53" width="212" border="0" /></a>     </p>
<p>Luego de esto, podremos almacenar tantos datos del mismo tipo como posiciones tenga el vector. Por ejemplo en la variable booleanos se podr&#225; almacenar hasta 3 variables de tipo bool y en la variable texto se podr&#225; almacenar hasta 100 variables de tipo string.    <br />Es importante tener en cuenta que la primera posici&#243;n de un vector es la posici&#243;n 0, por lo cual si la longitud es de 5, las posiciones van desde la 0 hasta la 4.     </p>
<p>Para almacenar informaci&#243;n en un vector, solo debemos hacer referencia a la posici&#243;n del vector donde deseamos almacenarla y utilizar el operador de asignaci&#243;n (=).</p>
<p><a href="http://developmania.files.wordpress.com/2008/08/image2.png"><img style="border-width:0;" height="83" alt="image" src="http://developmania.files.wordpress.com/2008/08/image-thumb2.png?w=185&#038;h=83" width="185" border="0" /></a> </p>
<p>En el ejemplo anterior, se han almacenado 4 cadenas de texto (strings) en el vector texto declarado e instanciado anteriormente. Cada string se ha almacenado en una posici&#243;n del vector diferente. En caso de almacenar un string en una posici&#243;n donde ya se hab&#237;a almacenado anteriormente algo, el valor antiguo ser&#225; sobrescrito por el nuevo valor.</p>
<p>A continuaci&#243;n se almacena en cada posici&#243;n restante del vector una cadena de texto mediante un operador de control de flujo (for). Este operador es posible utilizarlo con todas las colecciones en .NET ya que todas son enumerables debido a que implementan la interface IEnumerable.</p>
<p><a href="http://developmania.files.wordpress.com/2008/08/image3.png"><img style="border-width:0;" height="151" alt="image" src="http://developmania.files.wordpress.com/2008/08/image-thumb3.png?w=395&#038;h=151" width="395" border="0" /></a> </p>
<p>Un vector puede tener mas de una dimensi&#243;n seg&#250;n sea necesario. Un vector de dos dimensiones es considerado una matriz de datos.    <br />Para definir un vector de mas de una dimensi&#243;n, se utiliza el car&#225;cter &#8216;,&#8217; en los corchetes de la definici&#243;n del mismo.</p>
<p>int [] a =new int[2]; //Una dimensi&#243;n</p>
<p>int [ , ] a = new int [2,3]; //Dos dimensiones</p>
<p>int [ , , ]a = new int[2,3,4]; //Tres dimensiones</p>
<p>Las propiedades mas importantes que exponen los vectores se presentan a continuaci&#243;n:</p>
<p>Length: Indica la longitud total del vector (En todas las dimensiones).</p>
<p>Rank: Indica el numero total de dimensiones del vector.</p>
<p>Para obtener la longitud total de un determinada dimensi&#243;n, se debe utilizar el m&#233;todo GetLength que recibe como par&#225;metro un entero indicando el &#237;ndice de la dimensi&#243;n de la cual se desea conocer la longitud (La primera dimensi&#243;n tiene como &#237;ndice 0).</p>
<p>Aunque es posible crear vectores de mas de una dimensi&#243;n, no es recomendable utilizar mucho esta t&#233;cnica en las aplicaciones ya que la complejidad de nuestro algoritmo se incrementa considerablemente, teniendo en cuenta que el numero de iteraciones necesarias para recorrer todas las posiciones del vector aumenta de manera exponencial en funci&#243;n del numero de dimensiones. Generalmente el numero m&#225;ximo de dimensiones que se utiliza en un vector es 2 cuando se necesita trabajar con matrices de datos.</p>
<p>A continuaci&#243;n se muestra un ejemplo de una matriz de datos:</p>
<p><a href="http://developmania.files.wordpress.com/2008/08/image4.png"><img style="border-width:0;" height="295" alt="image" src="http://developmania.files.wordpress.com/2008/08/image-thumb4.png?w=494&#038;h=295" width="494" border="0" /></a> </p>
<p>Otra de las colecciones que se pueden crear con los vectores es un jagged array o en espa&#241;ol un array de arrays. Se puede pensar en un jagged array como un vector de una dimensi&#243;n, donde en cada posici&#243;n en lugar de almacenar un tipo de dato especifico, almacena otro vector.</p>
<p><a href="http://developmania.files.wordpress.com/2008/08/image5.png"><img height="244" alt="image" src="http://developmania.files.wordpress.com/2008/08/image-thumb5.png?w=122&#038;h=244" width="122" align="left" border="0" /></a>&#160; </p>
<p>&#160;</p>
<p>En esta imagen se ilustra gr&#225;ficamente como se ver&#237;a un jagged&#160; array. En este ejemplo, se tiene un vector exterior de 4 posiciones y en cada una de las posiciones almacena un vector tambi&#233;n de 4 posiciones. No es obligaci&#243;n que todos los vectores sean de la misma longitud.</p>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<p>Para declarar un array de arrays en C#, se debe utilizar la siguiente sintaxis:</p>
<p>int [][] jagged;</p>
<p>Para instanciar un jagged array se debe indicar el numero de posiciones que tendr&#225; el vector contenedor, como se hace con un vector normal de una dimensi&#243;n.</p>
<p>int [][] jagged = new int[3][];</p>
<p>En el ejemplo anterior se ha definido un array de tres posiciones, donde se almacenara en cada una de ellas, un array de enteros (indicado por el segundo par de corchetes). Luego de inicializar el vector contenedor, podremos crear los vectores internos como se muestra a continuaci&#243;n:</p>
<p>&#160;<a href="http://developmania.files.wordpress.com/2008/08/image6.png"><img style="border-right:0;border-top:0;border-left:0;border-bottom:0;" height="187" alt="image" src="http://developmania.files.wordpress.com/2008/08/image-thumb6.png?w=389&#038;h=187" width="389" border="0" /></a> </p>
<p>Igualmente se puede crear un array de arrays de varias dimensiones, donde cada vector almacenado tendr&#225; 2, 3 o mas dimensiones seg&#250;n sea necesario.</p>
<p><a href="http://developmania.files.wordpress.com/2008/08/image7.png"><img style="border-right:0;border-top:0;border-left:0;border-bottom:0;" height="107" alt="image" src="http://developmania.files.wordpress.com/2008/08/image-thumb7.png?w=368&#038;h=107" width="368" border="0" /></a> </p>
<p> Sin embargo, la complejidad en este caso aumenta bastante y se debe buscar siempre obtener el mejor rendimiento posible en nuestras aplicaciones, por lo tanto estas colecciones complejas deben ser utilizadas &#250;nicamente cuando sea necesario y cuando ninguna de las colecciones disponibles en la plataforma .NET es suficiente para almacenar la informaci&#243;n.</p>
<p>En un pr&#243;ximo post explicare otra colecci&#243;n b&#225;sica.</p>
<p>Suerte !!!.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/developmania.wordpress.com/77/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/developmania.wordpress.com/77/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/developmania.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/developmania.wordpress.com/77/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/developmania.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/developmania.wordpress.com/77/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/developmania.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/developmania.wordpress.com/77/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/developmania.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/developmania.wordpress.com/77/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/developmania.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/developmania.wordpress.com/77/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/developmania.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/developmania.wordpress.com/77/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/developmania.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/developmania.wordpress.com/77/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=developmania.wordpress.com&amp;blog=3736555&amp;post=77&amp;subd=developmania&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://developmania.wordpress.com/2008/08/09/colecciones-de-datos-en-cnet-parte-i-vectores/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">fzapataramirez</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2008/08/image-thumb.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2008/08/image-thumb1.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2008/08/image-thumb2.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2008/08/image-thumb3.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2008/08/image-thumb4.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2008/08/image-thumb5.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2008/08/image-thumb6.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://developmania.files.wordpress.com/2008/08/image-thumb7.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
	</channel>
</rss>
