<?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>Datapayasadas</title>
	<atom:link href="http://datapayasadas.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://datapayasadas.wordpress.com</link>
	<description>Datasets y DataAdapters en su mas delirante expresión ...</description>
	<lastBuildDate>Wed, 21 Dec 2011 14:20:59 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='datapayasadas.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Datapayasadas</title>
		<link>http://datapayasadas.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://datapayasadas.wordpress.com/osd.xml" title="Datapayasadas" />
	<atom:link rel='hub' href='http://datapayasadas.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Performance Tunning: Identificando cuellos de botella</title>
		<link>http://datapayasadas.wordpress.com/2011/12/21/performance-tunning-identificando-cuellos-de-botella/</link>
		<comments>http://datapayasadas.wordpress.com/2011/12/21/performance-tunning-identificando-cuellos-de-botella/#comments</comments>
		<pubDate>Wed, 21 Dec 2011 03:45:23 +0000</pubDate>
		<dc:creator>pabloide86</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Herramientas]]></category>
		<category><![CDATA[.Net Profiling]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[profiler]]></category>
		<category><![CDATA[tunning]]></category>

		<guid isPermaLink="false">http://datapayasadas.wordpress.com/?p=393</guid>
		<description><![CDATA[Holasss amigos! Hacia muchísimo que no escribía por acá! El motivo de este post es compartir mi experiencia con respecto al tunning de performance de una aplicación, mas específicamente de una aplicación web.  Mas que nada para compartir algunas herramientas y procedimientos que me fueron muy útiles a la hora de identificar cuellos de botella en el código. Por desgracia, este trabajo siempre suele dejarse para [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=datapayasadas.wordpress.com&amp;blog=3707397&amp;post=393&amp;subd=datapayasadas&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Holasss amigos! Hacia muchísimo que no escribía por acá! El motivo de este post es compartir mi experiencia con respecto al tunning de performance de una aplicación, mas específicamente de una aplicación web.  Mas que nada para compartir algunas herramientas y procedimientos que me fueron muy útiles a la hora de identificar cuellos de botella en el código.</p>
<p>Por desgracia, este trabajo siempre suele dejarse para el final, cuando todo el trabajo ya esta hecho y estamos al horno con la entrega por lo que cualquier cambio impacta mucho! Asique manos a la obra..</p>
<p><span id="more-393"></span></p>
<p>Lo primero que necesitamos es un ambiente aislado para realizar las mediciones, si es posible contar con un ambiente similar al que se contará para desplegar la aplicación mucho mejor.. y sino por lo menos contar con las mismas versiones de sistema operativo, base de datos, servidor web, etc..</p>
<p>También necesitaremos algunas herramientas para realizar las mediciones y poder obtener un diagnostico mas preciso sobre dónde se encuentra el problema. Algunas de las que me resultaron muy utiles son:</p>
<ul>
<li>Drone Profiler <a href="http://www.droneprofiler.com/index.aspx">http://www.droneprofiler.com/index.aspx</a> (Excelente profiler para el lado servidor que cuenta con una versión free para uso personal).</li>
<li>DynaTrace AJAX Edition <a href="http://ajax.dynatrace.com/ajax/en/">http://ajax.dynatrace.com/ajax/en/</a> (Otro excelente profiler pero esta vez para el lado cliente. Se integra con FireFox y con el innombrable cuyas iniciales son dos vocales que no son A, O, U..también es free.</li>
<li>Existen otras herramientas como YSlow, FireBug, Fiddler, HttpFox, etc. que también nos pueden ser útiles.</li>
<li>Y por ultimo, SQL Profiler por si alguno se anima a revisar la base de datos <img src='http://s2.wp.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </li>
</ul>
<p><strong>Ok, y ahora ¿¿¡por donde empiezo!??</strong></p>
<p>Les cuento mi experiencia con una pagina de consulta que me tocó optimizar. Dicha consulta tardaba unos 19 segundos en mostrar los resultados (10 registros). Cabe destacar que por cada uno de esos 10 registros debía validar una buena cantidad de lógica de negocio para mostrar u ocultar unos checkboxes.</p>
<p>Lo primero que hice fue abrir DynaTrace y ejecutar una sola vez la consulta. De los resultados obtuve que de esos 19 segundos, 14 los perdía en el servidor (llamada al WebMethod que cargaba la grilla por AJAX) y el resto en el cliente (JavaScript/jQuery no optimizado), por lo que el problema evidentemente estaba en el servidor.</p>
<p>Teniendo esta información cerré el DynaTrace y abrí el Drone Profiler, repitiendo la misma prueba: ejecutar una vez la consulta. Con eso logré identificar cuales métodos tardaban mas tiempo en ejecutarse.. la mayoría eran métodos de la capa de acceso a datos (basada en Entity Framework)..con SQL Profiler descarté que el problema fuese la consulta, por lo que definitivamente logré aislar el problema con Entity Framework que tardaba demasiado tiempo en generar las consultas SQL.. luego con la ayuda de Google encontré varias optimizaciones que fui probando hasta lograr un tiempo aceptable. También refactoricé un par de métodos para leer una sola vez las 10 entidades en vez de leerlas una por una.. eso también ayudó..</p>
<p>Luego de todas estas optimizaciones, el tiempo de la consulta bajó a un mínimo de 2,9 segundos, cifra que no pude bajar sin tener que refactorizar mas agresivamente el código..</p>
<p>Como verán, no hay una única forma de encarar esta problemática.. se trata de realizar un primer diagnóstico para ver donde puede estar el cuello de botella (si esta en el lado cliente, si esta en el servidor, o si es la base de datos).. luego investigar mas de cerca el código, ver si existe alguna optimización, o bien si amerita una refactorización completa.. muchas veces el código mas compacto y reutilizable no es el que mejor performa..</p>
<p>Algunos consejos rápidos para optimizar los tiempos de carga de la página:</p>
<ul>
<li>Compresión en IIS</li>
<li>Cache para almacenar listas que rara vez cambian (productos, paises, provincias, etc.)</li>
<li>Minificar y combinar JavaScript/CSS</li>
<li>Compilar en modo Release al desplegar en un ambiente productivo</li>
<li>Desactivar el ViewState para controles que no lo necesitan</li>
<li>Usar con cuidado los selectores de jQuery</li>
<li>No abusar de $(document).ready() y usar $(window).load()</li>
</ul>
<p>Por ultimo, les dejo algunos enlaces que encontré sobre optimizaciones..</p>
<p><a href="http://www.asp.net/web-forms/tutorials/continuing-with-ef/maximizing-performance-with-the-entity-framework-in-an-asp-net-web-application">http://www.asp.net/web-forms/tutorials/continuing-with-ef/maximizing-performance-with-the-entity-framework-in-an-asp-net-web-application</a></p>
<p><a href="http://blog.dynatrace.com/2009/11/09/101-on-jquery-selector-performance/?source=dae30">http://blog.dynatrace.com/2009/11/09/101-on-jquery-selector-performance/?source=dae30</a></p>
<p><a href="http://www.artzstudio.com/2009/04/jquery-performance-rules/">http://www.artzstudio.com/2009/04/jquery-performance-rules/</a></p>
<p><a href="http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/d52ff289-94d3-4085-bc4e-24eb4f312e0e.mspx?mfr=true">http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/d52ff289-94d3-4085-bc4e-24eb4f312e0e.mspx?mfr=true</a></p>
<p>Espero que les haya resultado útil!</p>
<p>Saludos y felices fiestas!!!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/datapayasadas.wordpress.com/393/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/datapayasadas.wordpress.com/393/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/datapayasadas.wordpress.com/393/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/datapayasadas.wordpress.com/393/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/datapayasadas.wordpress.com/393/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/datapayasadas.wordpress.com/393/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/datapayasadas.wordpress.com/393/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/datapayasadas.wordpress.com/393/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/datapayasadas.wordpress.com/393/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/datapayasadas.wordpress.com/393/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/datapayasadas.wordpress.com/393/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/datapayasadas.wordpress.com/393/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/datapayasadas.wordpress.com/393/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/datapayasadas.wordpress.com/393/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=datapayasadas.wordpress.com&amp;blog=3707397&amp;post=393&amp;subd=datapayasadas&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://datapayasadas.wordpress.com/2011/12/21/performance-tunning-identificando-cuellos-de-botella/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6f7927a7c2c6558264298a1350df50c8?s=96&#38;d=" medium="image">
			<media:title type="html">Gnanduuu</media:title>
		</media:content>
	</item>
		<item>
		<title>Un poquito de Generics</title>
		<link>http://datapayasadas.wordpress.com/2010/07/17/un-poquito-de-generics/</link>
		<comments>http://datapayasadas.wordpress.com/2010/07/17/un-poquito-de-generics/#comments</comments>
		<pubDate>Sat, 17 Jul 2010 16:12:44 +0000</pubDate>
		<dc:creator>pabloide86</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Generics]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[generics]]></category>

		<guid isPermaLink="false">http://datapayasadas.wordpress.com/?p=223</guid>
		<description><![CDATA[Hola mis queridos List&#60;Amigos&#62; Hoy vamos a hablar un poco sobre el mundo de los Generics. Vamos derecho al código&#8230; Supongamos que necesitamos un método que devuelve un objeto Persona: Para llamar a este método lo hacemos de la forma: Hasta aquí ninguna novedad. Ahora bien, supongamos que queremos hacer que el mismo método trabaje [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=datapayasadas.wordpress.com&amp;blog=3707397&amp;post=223&amp;subd=datapayasadas&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Hola mis queridos List&lt;Amigos&gt;</p>
<p>Hoy vamos a hablar un poco sobre el mundo de los Generics. Vamos derecho al código&#8230;</p>
<p>Supongamos que necesitamos un método que devuelve un objeto Persona:</p>
<p><pre class="brush: csharp;">
public Persona GetPersonaByID(int idPersona)
{
     var persona = new Persona();
     // Aquí va el codigo para armar el objeto
     return persona;
}
</pre></p>
<p>Para llamar a este método lo hacemos de la forma:</p>
<p><pre class="brush: csharp;">
Persona objeto = GetPersonaByID(5);
</pre></p>
<p>Hasta aquí ninguna novedad. Ahora bien, supongamos que queremos hacer que el mismo método trabaje con cualquier tipo de objetos:</p>
<p><pre class="brush: csharp;">
//T: parámetro de tipo
public T GetEntityByID&lt;T&gt;(int idEntity)
{
    // Aquí va el código para armar el objeto. Veremos mas adelante qué necesitamos
    // para instanciar un objeto T
    // ahora se complica un poco mas porque no sabemos bien que tipo de objetos es T
    return entity;
}
</pre></p>
<p>Y ahora cuando llamamos a este método le vamos a indicar con qué tipo de objetos tiene que operar:</p>
<p><pre class="brush: csharp;">
Persona p = GetEntityByID&lt;Persona&gt;(5);
Ticket t = GetEntityByID&lt;Ticket&gt;(8);
Auto a = GetEntityByID&lt;Auto&gt;(19);
</pre></p>
<p><span id="more-223"></span></p>
<p>Entonces, qué fue lo que paso!? Cuando le pasamos el parámetro de tipo al objeto le estamos indicando con qué tipo de objetos tiene que trabajar, y a ese parámetro de tipo lo podemos usar para instanciar clases, para  indicar qué tipo de objeto devuelve el método, para pasarlo como parámetro a otras clases, etc&#8230;</p>
<p>En el ejemplo de arriba, el método GetEntityByID&lt;Persona&gt;(5); me devuelve un objeto Persona y no un object.</p>
<p>El mejor ejemplo que vimos de esto aplicado en la realidad es el List. Cuando nosotros hicimos:</p>
<p><pre class="brush: csharp;">
List&lt;Persona&gt; lista = new List&lt;Persona&gt;();
lista.Add(persona1);
</pre></p>
<p>Lo que puede estar pasando en el framework debe ser algo como esto:</p>
<p><pre class="brush: csharp;">
public class List&lt;T&gt;
{
     private System.Array list;  //Array interno que puede contener cualquier tipo de objetos

     //Constructor
     public List&lt;T&gt;()
     { 
     }

     public void Add(T objeto)
     {
           list.Add(objeto);
     }
}
</pre></p>
<p><strong>Constraints</strong></p>
<p>Ahora bien, puede ser que querramos restringir que tipos de objetos queremos que puedan usar esos métodos, sobre todo cuando vamos a llamar a determinados métodos y querémos estar seguros de que los métodos esten ahi!. Para ello tenemos los constraints que se aplican con la palabra where:</p>
<p><pre class="brush: csharp;">
public T GetEntityByID&lt;T&gt;(int idObjeto) where T: EntidadBase, IOperaciones, new()
{

}
</pre></p>
<p>Con esto queremos decir que T tiene que heredar de EntidadBase, implementar la interface IOperaciones y tener un constructor sin parámetros. De lo contrario dará un error en tiempo de compilación.</p>
<p>Entonces ahora podemos estar seguros de realizar determinadas operaciones como por ejemplo:<br />
<pre class="brush: csharp;">
public T GetEntityByID&lt;T, D&gt;(int idObjeto) where T: IOperaciones, where D: DataAccessLayer&lt;T&gt;, new()
{
    var objectDAL= new D&lt;T&gt;();  // D tiene el constraint de new()
    var object= Read(idObjeto);
    bool isEmpty = obj.IsEmpty();
    return object;
}
</pre></p>
<p>Ya la vamos complicando un poco mas <img src='http://s2.wp.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  lo que hicimos ahí fue pasarle dos parametros de tipo, T para indicar con qué tipo de entidades trabaja y D para indicarle con que tipo de DataAccessLayer.</p>
<p>Entonces para usar ese método tendremos que hacerlo de la siguiente manera:</p>
<p><pre class="brush: csharp;">
Persona p = GetObjectByID&lt;Persona, PersonaDAL&gt;(7);
</pre></p>
<p>Como verán, las posibilidades son infinitas. Espero que les sirva!!</p>
<p>Saludos!!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/datapayasadas.wordpress.com/223/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/datapayasadas.wordpress.com/223/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/datapayasadas.wordpress.com/223/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/datapayasadas.wordpress.com/223/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/datapayasadas.wordpress.com/223/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/datapayasadas.wordpress.com/223/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/datapayasadas.wordpress.com/223/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/datapayasadas.wordpress.com/223/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/datapayasadas.wordpress.com/223/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/datapayasadas.wordpress.com/223/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/datapayasadas.wordpress.com/223/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/datapayasadas.wordpress.com/223/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/datapayasadas.wordpress.com/223/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/datapayasadas.wordpress.com/223/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=datapayasadas.wordpress.com&amp;blog=3707397&amp;post=223&amp;subd=datapayasadas&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://datapayasadas.wordpress.com/2010/07/17/un-poquito-de-generics/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6f7927a7c2c6558264298a1350df50c8?s=96&#38;d=" medium="image">
			<media:title type="html">Gnanduuu</media:title>
		</media:content>
	</item>
		<item>
		<title>this.Title.Replace(&#8220;.Net&#8221;, &#8220;Java&#8221;);</title>
		<link>http://datapayasadas.wordpress.com/2010/06/03/this-title-replace-net-java/</link>
		<comments>http://datapayasadas.wordpress.com/2010/06/03/this-title-replace-net-java/#comments</comments>
		<pubDate>Thu, 03 Jun 2010 21:05:43 +0000</pubDate>
		<dc:creator>Matías</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://datapayasadas.wordpress.com/?p=378</guid>
		<description><![CDATA[Porque no todo en la vida es .Net: Esto es Java usando la librería gráfica SWT. Lindo, ¿no?. Que se vea nativo en Linux, Mac OSX y Windows es kinda priceless.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=datapayasadas.wordpress.com&amp;blog=3707397&amp;post=378&amp;subd=datapayasadas&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Porque no todo en la vida es .Net:</p>
<a href="http://datapayasadas.wordpress.com/2010/06/03/this-title-replace-net-java/#gallery-1-slideshow">Click to view slideshow.</a>
<p>Esto es Java usando la librería gráfica SWT. Lindo, ¿no?.</p>
<p>Que se vea nativo en Linux, Mac OSX y Windows es <em>kinda priceless</em>.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/datapayasadas.wordpress.com/378/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/datapayasadas.wordpress.com/378/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/datapayasadas.wordpress.com/378/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/datapayasadas.wordpress.com/378/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/datapayasadas.wordpress.com/378/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/datapayasadas.wordpress.com/378/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/datapayasadas.wordpress.com/378/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/datapayasadas.wordpress.com/378/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/datapayasadas.wordpress.com/378/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/datapayasadas.wordpress.com/378/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/datapayasadas.wordpress.com/378/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/datapayasadas.wordpress.com/378/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/datapayasadas.wordpress.com/378/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/datapayasadas.wordpress.com/378/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=datapayasadas.wordpress.com&amp;blog=3707397&amp;post=378&amp;subd=datapayasadas&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://datapayasadas.wordpress.com/2010/06/03/this-title-replace-net-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/498533c930f074f8a973101b65a22d0c?s=96&#38;d=" medium="image">
			<media:title type="html">matias</media:title>
		</media:content>
	</item>
		<item>
		<title>Relanzar Excepciones</title>
		<link>http://datapayasadas.wordpress.com/2010/04/10/relanzar-excepciones/</link>
		<comments>http://datapayasadas.wordpress.com/2010/04/10/relanzar-excepciones/#comments</comments>
		<pubDate>Sat, 10 Apr 2010 21:52:44 +0000</pubDate>
		<dc:creator>Matías</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Excepciones]]></category>

		<guid isPermaLink="false">http://datapayasadas.wordpress.com/?p=370</guid>
		<description><![CDATA[Me encontraba buscando la causa de porque perdía el stack trace al relanzar excepciones capturadas y finalmente logre dar en el clavo, las estaba usando mal&#8230; shame on me!. No recuerdo de donde tomé la mala costumbre, pero lo que venía haciendo hasta ahora era: Resulta que al hacer esto no estamos relanzando la excepción [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=datapayasadas.wordpress.com&amp;blog=3707397&amp;post=370&amp;subd=datapayasadas&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Me encontraba buscando la causa de porque perdía el <strong><em>stack trace</em></strong> al relanzar excepciones capturadas y finalmente logre dar en el clavo, las estaba usando mal&#8230; <em>shame on me!</em>.</p>
<p>No recuerdo de donde tomé la mala costumbre, pero lo que venía haciendo hasta ahora era:</p>
<p><pre class="brush: csharp;">try
{
    // Algo de código
}
catch (Exception ex)
{
    // Hago algo con ex
    throw ex;
}</pre></p>
<p>Resulta que al hacer esto no estamos relanzando la excepción original, estamos iniciando un nuevo camino para la excepción usando la misma instancia de <em><strong>ex</strong></em>.</p>
<p>Para solucionarlo, es decir, no perder el <em><strong>stack trace</strong></em> debemos modificar el código para que quede así:</p>
<p><pre class="brush: csharp;">try
{
    // Algo de código
}
catch (Exception ex)
{
    // Hago algo con ex
    throw;
}</pre></p>
<p>¿Soy el único pavote que lo hacía mal?</p>
<p>Quiero creer que no <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/datapayasadas.wordpress.com/370/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/datapayasadas.wordpress.com/370/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/datapayasadas.wordpress.com/370/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/datapayasadas.wordpress.com/370/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/datapayasadas.wordpress.com/370/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/datapayasadas.wordpress.com/370/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/datapayasadas.wordpress.com/370/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/datapayasadas.wordpress.com/370/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/datapayasadas.wordpress.com/370/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/datapayasadas.wordpress.com/370/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/datapayasadas.wordpress.com/370/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/datapayasadas.wordpress.com/370/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/datapayasadas.wordpress.com/370/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/datapayasadas.wordpress.com/370/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=datapayasadas.wordpress.com&amp;blog=3707397&amp;post=370&amp;subd=datapayasadas&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://datapayasadas.wordpress.com/2010/04/10/relanzar-excepciones/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/498533c930f074f8a973101b65a22d0c?s=96&#38;d=" medium="image">
			<media:title type="html">matias</media:title>
		</media:content>
	</item>
		<item>
		<title>Atacando dos frentes: Serialización de objetos y transporte sobre UDP</title>
		<link>http://datapayasadas.wordpress.com/2010/04/09/atacando-dos-frentes-serializacion-de-objetos-y-transporte-sobre-udp/</link>
		<comments>http://datapayasadas.wordpress.com/2010/04/09/atacando-dos-frentes-serializacion-de-objetos-y-transporte-sobre-udp/#comments</comments>
		<pubDate>Sat, 10 Apr 2010 01:10:47 +0000</pubDate>
		<dc:creator>Matías</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Serialización]]></category>
		<category><![CDATA[UDP]]></category>

		<guid isPermaLink="false">http://datapayasadas.wordpress.com/?p=350</guid>
		<description><![CDATA[Hola!, hoy voy a contarles un poco sobre el protocolo UDP y luego mostraré un ejemplo para aprovechar la serialización de objetos de la que les hablé hace unos días. Como siempre, vamos a empezar por lo más básico. ¿Qué es UDP? Es un protocolo a nivel de transporte (capa 4 del modelo OSI) basado [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=datapayasadas.wordpress.com&amp;blog=3707397&amp;post=350&amp;subd=datapayasadas&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Hola!, hoy voy a contarles un poco sobre el protocolo UDP y luego mostraré un ejemplo para aprovechar la <a href="http://datapayasadas.wordpress.com/2010/04/01/serializando-y-deserializando-objetos/">serialización de objetos</a> de la que les hablé hace unos días.</p>
<p>Como siempre, vamos a empezar por lo más básico.</p>
<h2><span id="more-350"></span>¿Qué es UDP?</h2>
<p>Es un protocolo a nivel de transporte (<a href="http://es.wikipedia.org/wiki/Modelo_OSI">capa 4 del modelo OSI</a>) basado en el intercambio de datagramas. Se puede decir que no es un protocolo orientado a la conexión, a diferencia del otro hiper-archi-conocido protocolo TCP que si lo es. Las siglas vienen del inglés: <em><strong>U</strong>ser <strong>D</strong>atagram <strong>P</strong>rotocol</em>.</p>
<p>Lo bueno de este protocolo, que también trae ciertas desventajas, es que proporciona una forma simple para que las aplicaciones envíen datagramas IP encapsulados sin tener que establecer una conexión. Si, leyeron bien, no hace falta establecer una conexión, cada datagrama tiene información suficiente para llegar a destino. UDP transmite segmentos que consisten en un encabezado seguido por la carga útil; cuenta además (aunque es opcional) con un <em>checksum</em> o suma de verificación, esto permite comprobar la integridad de los datos transferidos.</p>
<p>Todo esta muy lindo hasta acá, pero ahora les voy a tener que <em>pinchar el globo</em>.</p>
<h2>Algunas desventajas del protocolo UDP</h2>
<ul>
<li>Volviendo al título elegido para este artículo podríamos decir que, al igual que en las batallas no todo lo que enviamos necesariamente llegara a destino. UDP no cuenta con un mecanismo de control de envíos, por lo que si no hacemos nada por nuestra cuenta podemos perder paquetes y nada nos va a alertar de ello, ni tampoco tratará de reenviarlos.</li>
<li>UDP también carece de control de flujo, o mejor dicho, no nos asegura que el orden en que enviamos los paquetes va a ser el mismo en el que se recibirán.</li>
</ul>
<p>Volviendo al tema de programación, .Net nos ofrece la opción de trabajar con <a href="http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.aspx">Sockets</a> directamente o a través de clases de ayuda (que simplifican bastante el trabajo), como ser <a href="http://msdn.microsoft.com/en-us/library/system.net.sockets.udpclient.aspx">UdpClient</a>.</p>
<p>Voy a mostrarles utilizando ejemplos de código dos pequeños programas, uno se encarga solamente de enviar y el otro solamente de recibir. Es la forma más básica que encontré y creo que así va a ser más fácil verlo (el emisor y receptor podrían estar en el mismo programa).</p>
<h2>El código</h2>
<p>Vamos a usar una clase serializable a la que llamaremos Paquete. Instancias de este objeto es lo que vamos a enviar y recibir sobre el protocolo UDP.</p>
<h3>Paquete.cs</h3>
<p><pre class="brush: csharp;">using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

[Serializable]
public class Paquete
{
    public Int32 Orden { get; set; }
    public String Mensaje { get; set; }

    public static byte[] Serializar(Paquete paquete)
    {
        using (MemoryStream memStream = new MemoryStream())
        {
            BinaryFormatter binFormatter = new BinaryFormatter();
            binFormatter.Serialize(memStream, paquete);

            return memStream.ToArray();
        }
    }

    public static Paquete Deserializar(byte[] paqueteEnBytes)
    {
        try
        {
            using (MemoryStream memStream = new MemoryStream(paqueteEnBytes))
            {
                BinaryFormatter binFormatter = new BinaryFormatter();
                memStream.Position = 0;

                return (Paquete)binFormatter.Deserialize(memStream);
            }
        }
        catch
        {
            return null;
        }
    }
}</pre></p>
<p>Hasta acá no hay nada nuevo. Tenemos una clase con dos propiedades públicas, una de las cuales es un entero (orden) y la otra una cadena de caracteres (mensaje). También tenemos dos métodos estático (asi podemos llamarlos sin necesidad de referenciar una instancia de la clase) para serializar y deserializar.</p>
<p>Marcamos la clase como [Serializable] para que la podamos convertir a un arreglo de bytes con los métodos que mencione anteriormente. Vale la pena aclarar que todos los métodos que manejan sockets en .net, envian y reciben arreglos de bytes, por eso es tan importante la serialización en esto.</p>
<p>Ahora veamos el código para enviar un paquete:</p>
<h3>EmisorUDP.cs</h3>
<p><pre class="brush: csharp;">using System;
using System.Net;
using System.Net.Sockets;

class EmisorUDP
{
    static void Main(string[] args)
    {
        using (UdpClient cliente = new UdpClient())
        {
            byte[] bytesParaEnviar;
            String strPaquete = String.Empty;
            int contador = 0;

            while (true)
            {
                Console.Write(&quot;Escribe un mensaje y luego presiona [enter]: &quot;);
                strPaquete = Console.ReadLine();

                if (String.IsNullOrEmpty(strPaquete))
                    return;

                Paquete paquete = new Paquete()
                {
                    Orden = contador,
                    Mensaje = strPaquete
                };

                bytesParaEnviar = Paquete.Serializar(paquete);
                cliente.Send(bytesParaEnviar, bytesParaEnviar.Length, new IPEndPoint(IPAddress.Broadcast, 9998));

                contador++;
            }
        }
    }
}</pre></p>
<p>Bastante descriptivo en si, pero vamos a explicar un poco. Dentro de un ciclo while pedimos al usuario que ingrese un mensaje para enviar, si no escribe nada y solo presiona la tecla enter, entonces salimos del programa.</p>
<p>Si el usuario escribió algo lo guardamos en una nueva instancia de <strong>Paquete</strong> y además asignamos el número del mensaje (tomado desde el <strong>contador</strong>). Para poder enviar este paquete vamos a tener que, primero, obtener la representación en bytes y, segundo, especificar un destino. Para cumplir con lo primero serializamos la instancia que acabamos de crear; para lo segundo vamos a optar por enviar un mensaje del tipo <a href="http://es.wikipedia.org/wiki/Broadcast_%28inform%C3%A1tica%29"><strong>broadcast</strong></a> en el puerto 9998, es decir, es un paquete que se va a enviar a todos los dispositivos de nuestra red.</p>
<p>Como ya dije antes, este proceso se va a repetir hasta que no se ingrese ningún caracter más, solo la tecla enter.</p>
<h3>ReceptorUDP.cs</h3>
<p><pre class="brush: csharp;">using System;
using System.Net;
using System.Net.Sockets;

class ReceptorUDP
{
    static void Main(string[] args)
    {
        using (UdpClient cliente = new UdpClient(9998))
        {
            while (true)
            {
                IPEndPoint emisor = null;
                byte[] bytesRecibidos = cliente.Receive(ref emisor);
                Paquete paquete = Paquete.Deserializar(bytesRecibidos);

                Console.WriteLine(&quot;Paquete enviado por {0}:&quot;, emisor);
                Console.WriteLine(&quot;-- Orden: {0}&quot;, paquete.Orden);
                Console.WriteLine(&quot;-- Mensaje: {0}&quot;, paquete.Mensaje);
            }
        }
    }
}</pre></p>
<p>En el receptor tenemos que registrar el puerto en el que vamos a <em><strong>escuchar</strong></em>, en este caso es el 9998 (el que usamos al enviar), tarea que podemos realizar pasando el número de puerto en el constructor de UdpClient.</p>
<p>Notese que necesitaremos crear un objeto de la clase <a href="http://msdn.microsoft.com/en-us/library/system.net.ipendpoint.aspx">IPEndPoint</a> para pasarlo por referencia, como parametro, al método Receive de UdpClient. Éste último se encargara de guardar ahí la información del emisor (como ser la dirección IP y el puerto remoto).</p>
<p>Otra cosa importante, tanto <a href="http://msdn.microsoft.com/en-us/library/system.net.sockets.udpclient.send%28v=VS.90%29.aspx"><strong>UdpClient.Send</strong></a> como <a href="http://msdn.microsoft.com/en-us/library/system.net.sockets.udpclient.receive.aspx"><strong>UdpClient.Receive</strong></a> son métodos sincronicos, es decir, se van a bloquear hasta que envíen o reciban un paquete. Cuando empiecen a trabajar &#8220;en serio&#8221; con UDP (o TCP) van a tener que usar Threads (Hilos) independientes para no congelar la interfaz del usuario o probar con los métodos asíncronos tales como <a href="http://msdn.microsoft.com/en-us/library/system.net.sockets.udpclient.beginsend%28v=VS.90%29.aspx"><strong>UdpClient.BeginSend</strong></a>, <a href="http://msdn.microsoft.com/en-us/library/system.net.sockets.udpclient.beginreceive%28v=VS.90%29.aspx"><strong>UdpClient.BeginReceive</strong></a>.</p>
<p>Volviendo al código de ejemplo, una vez que recibimos un paquete (en realidad, la representación en un arreglo de bytes) vamos a poder deserializarlo para finalmente acceder a las propiedades Orden y Mensaje; imprimimos en pantalla esos datos y esperamos el siguiente paquete.</p>
<p>Recuerden las desventajas de las que hablamos, UDP no nos asegura que todo lo enviado sea recibido, ni que esten en el orden correcto.</p>
<p>Si todo ha salido bien, deberían ver algo así:</p>
<p><a href="http://datapayasadas.files.wordpress.com/2010/04/udp.png"><img class="aligncenter size-medium wp-image-361" title="Emisor y receptor UDP" src="http://datapayasadas.files.wordpress.com/2010/04/udp.png?w=296&#038;h=300" alt="Emisor y receptor UDP" width="296" height="300" /></a></p>
<p>Bueno, esto es todo por ahora, en el próximo artículo vamos a hacer lo mismo pero utilizando el protocolo TCP.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/datapayasadas.wordpress.com/350/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/datapayasadas.wordpress.com/350/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/datapayasadas.wordpress.com/350/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/datapayasadas.wordpress.com/350/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/datapayasadas.wordpress.com/350/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/datapayasadas.wordpress.com/350/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/datapayasadas.wordpress.com/350/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/datapayasadas.wordpress.com/350/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/datapayasadas.wordpress.com/350/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/datapayasadas.wordpress.com/350/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/datapayasadas.wordpress.com/350/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/datapayasadas.wordpress.com/350/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/datapayasadas.wordpress.com/350/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/datapayasadas.wordpress.com/350/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=datapayasadas.wordpress.com&amp;blog=3707397&amp;post=350&amp;subd=datapayasadas&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://datapayasadas.wordpress.com/2010/04/09/atacando-dos-frentes-serializacion-de-objetos-y-transporte-sobre-udp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/498533c930f074f8a973101b65a22d0c?s=96&#38;d=" medium="image">
			<media:title type="html">matias</media:title>
		</media:content>

		<media:content url="http://datapayasadas.files.wordpress.com/2010/04/udp.png?w=296" medium="image">
			<media:title type="html">Emisor y receptor UDP</media:title>
		</media:content>
	</item>
		<item>
		<title>Una de eventos y suscriptores</title>
		<link>http://datapayasadas.wordpress.com/2010/04/05/una-de-eventos-y-suscriptores/</link>
		<comments>http://datapayasadas.wordpress.com/2010/04/05/una-de-eventos-y-suscriptores/#comments</comments>
		<pubDate>Mon, 05 Apr 2010 15:19:02 +0000</pubDate>
		<dc:creator>Matías</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Eventos]]></category>

		<guid isPermaLink="false">http://datapayasadas.wordpress.com/?p=339</guid>
		<description><![CDATA[Navegando por StackOverflow me encontré con una pregunta interesante de alguien que buscaba la forma de disparar eventos sin la necesidad de comprobar primero la existencia de suscriptores. Si no lo conocen al sitio, les recomiendo que le peguen una miradita porque es realmente útil, es sencillamente un sitio de preguntas y respuestas para programadores. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=datapayasadas.wordpress.com&amp;blog=3707397&amp;post=339&amp;subd=datapayasadas&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Navegando por <a href="http://stackoverflow.com">StackOverflow</a> me encontré con una pregunta interesante de alguien que buscaba la forma de <a href="http://stackoverflow.com/questions/170907/is-there-a-downside-to-adding-an-anonymous-empty-delegate-on-event-declaration">disparar eventos sin la necesidad de comprobar primero la existencia de suscriptores</a>. Si no lo conocen al sitio, les recomiendo que le peguen una miradita porque es realmente útil, es sencillamente un sitio de preguntas y respuestas para programadores.</p>
<p><span id="more-339"></span>Volviendo al tema en sí, como ustedes saben, al disparar un evento en nuestra aplicación debemos primero comprobar que no sea <em><strong>null</strong></em>, lo cual indica que no hay ningún suscriptor para ese evento en particular. En caso de no realizar ésta comprobación, no podríamos disparar el evento sin luego recibir una excepción del tipo <strong><em>System.NullReferenceException</em></strong>.</p>
<p>Una forma alternativa que plantearon en StackOverflow, consiste en simplemente asignarle un delegado anónimo vacío al evento en el momento de su creación.</p>
<h2>¿Cómo se hace?</h2>
<p>Así:</p>
<p><pre class="brush: csharp;">public event EventHandler NombreDeNuestroEvento = delegate {};</pre></p>
<h2>¿Hay alguna contraindicación?</h2>
<p>Aparentemente el costo, en performance, es muy pequeño &#8230; demasiado pequeño, a menos que estén realizando un sistema crítico que hace una utilización realmente importante de eventos. Hay una <a href="http://stackoverflow.com/questions/170907/is-there-a-downside-to-adding-an-anonymous-empty-delegate-on-event-declaration/171200#171200">prueba de performance</a> que pueden hacer para ver efectivamente el costo de utilizar un delegado anónimo vacío.</p>
<p><pre class="brush: csharp;">using System;
using System.Diagnostics;

class Program
{
    public event EventHandler&lt;EventArgs&gt; EventWithDelegate = delegate { };
    public event EventHandler&lt;EventArgs&gt; EventWithoutDelegate;

    static void Main(string[] args)
    {
        //warm up
        new Program().DoTimings(false);
        //do it for real
        new Program().DoTimings(true);

        Console.WriteLine(&quot;Done&quot;);
        Console.ReadKey();
    }

    private void DoTimings(bool output)
    {
        const int iterations = 50000000;

        if (output)
        {
            Console.WriteLine(&quot;For {0} iterations . . .&quot;, iterations);
        }

        //with anonymous delegate attached to avoid null checks
        var stopWatch = Stopwatch.StartNew();

        for (var i = 0; i &lt; iterations; ++i)
        {
            RaiseWithAnonDelegate();
        }

        stopWatch.Stop();

        if (output)
        {
            Console.WriteLine(&quot;No null check (empty delegate attached): {0}ms&quot;, stopWatch.ElapsedMilliseconds);
        }

        //without any delegates attached (null check required)
        stopWatch = Stopwatch.StartNew();

        for (var i = 0; i &lt; iterations; ++i)
        {
            RaiseWithoutAnonDelegate();
        }

        stopWatch.Stop();

        if (output)
        {
            Console.WriteLine(&quot;With null check (no delegates attached): {0}ms&quot;, stopWatch.ElapsedMilliseconds);
        }

        //attach delegate
        EventWithoutDelegate += delegate { };

        //with delegate attached (null check still performed)
        stopWatch = Stopwatch.StartNew();

        for (var i = 0; i &lt; iterations; ++i)
        {
            RaiseWithoutAnonDelegate();
        }

        stopWatch.Stop();

        if (output)
        {
            Console.WriteLine(&quot;With null check (with delegate attached): {0}ms&quot;, stopWatch.ElapsedMilliseconds);
        }
    }

    private void RaiseWithAnonDelegate()
    {
        EventWithDelegate(this, EventArgs.Empty);
    }

    private void RaiseWithoutAnonDelegate()
    {
        var handler = EventWithoutDelegate;

        if (handler != null)
        {
            handler(this, EventArgs.Empty);
        }
    }
}</pre></p>
<p>Quedará en ustedes decidir si vale la pena o no utilizar este método. La diferencia es infinitesimal, unos pocos nanosegundos no van a matar a nadie &#8230; quiero creer.<br />
Interesante, ¿no les parece?.</p>
<p>Hasta la próxima.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/datapayasadas.wordpress.com/339/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/datapayasadas.wordpress.com/339/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/datapayasadas.wordpress.com/339/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/datapayasadas.wordpress.com/339/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/datapayasadas.wordpress.com/339/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/datapayasadas.wordpress.com/339/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/datapayasadas.wordpress.com/339/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/datapayasadas.wordpress.com/339/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/datapayasadas.wordpress.com/339/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/datapayasadas.wordpress.com/339/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/datapayasadas.wordpress.com/339/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/datapayasadas.wordpress.com/339/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/datapayasadas.wordpress.com/339/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/datapayasadas.wordpress.com/339/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=datapayasadas.wordpress.com&amp;blog=3707397&amp;post=339&amp;subd=datapayasadas&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://datapayasadas.wordpress.com/2010/04/05/una-de-eventos-y-suscriptores/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/498533c930f074f8a973101b65a22d0c?s=96&#38;d=" medium="image">
			<media:title type="html">matias</media:title>
		</media:content>
	</item>
		<item>
		<title>Serializando y deserializando objetos</title>
		<link>http://datapayasadas.wordpress.com/2010/04/01/serializando-y-deserializando-objetos/</link>
		<comments>http://datapayasadas.wordpress.com/2010/04/01/serializando-y-deserializando-objetos/#comments</comments>
		<pubDate>Thu, 01 Apr 2010 14:03:44 +0000</pubDate>
		<dc:creator>Matías</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Serialización]]></category>

		<guid isPermaLink="false">http://datapayasadas.wordpress.com/?p=330</guid>
		<description><![CDATA[Todos hemos escuchado hablar alguna vez la palabra serialización, pero posiblemente nunca nos hemos preocupado lo suficiente como para saber que es, en que consiste y cual es su utilidad. Generalmente cuando empezamos a programar aplicaciones que deben interactuar remotamente con otras (o con ella misma) es ahí cuando deberemos invertir unos minutos en comprender [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=datapayasadas.wordpress.com&amp;blog=3707397&amp;post=330&amp;subd=datapayasadas&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Todos hemos escuchado hablar alguna vez la palabra <strong>serialización</strong>, pero posiblemente nunca nos hemos preocupado lo suficiente como para saber que es, en que consiste y cual es su utilidad.</p>
<p>Generalmente cuando empezamos a programar aplicaciones que deben interactuar remotamente con otras (o con ella misma) es ahí cuando deberemos invertir unos minutos en comprender este concepto, muy importante por cierto y de extrema utilidad.<br />
<span id="more-330"></span><br />
Veamos que dice la <a href="http://es.wikipedia.org/wiki/Serializaci%C3%B3n">Wikipedia sobre serialización</a>:</p>
<blockquote><p>En ciencias de la computación, la serialización  (o marshalling en inglés) consiste en un proceso de codificación de un Objeto (programación orientada a objetos) en un medio de almacenamiento (como puede ser un archivo, o un buffer de memoria) con el fin de transmitirlo a través de una conexión en red como una serie de bytes o en un formato humanamente más legible como XML  o JSON, entre otros. La serie de bytes o el formato pueden ser usados para crear un nuevo objeto que es idéntico en todo al original, incluido su estado interno (por tanto, el nuevo objeto es un clon del original). La serialización  es un mecanismo ampliamente usado para transportar objetos a través de una red, para hacer persistente un objeto en un archivo o base de datos, o para distribuir objetos idénticos a varias aplicaciones o localizaciones.</p></blockquote>
<p>Bien, entonces es básicamente un mecanismo que nos permite representar un objeto como un arreglo de bytes. Por simple deducción, la deserialización es el proceso inverso, convertir un arreglo de bytes en un objeto.</p>
<h2>¿Cuales son las ventajas del proceso de serialización?</h2>
<p>Los datos serializados son fáciles de representar, transportar y almacenar. En .Net tenemos el tipo de datos byte, así como también podemos crear arreglos de ellos: byte[]. La mayoría, si no todos, los métodos para transmisión y recepción de datos tanto en Sockets como clases que simplifican un poco el trabajo (TcpClient) en red, envían y reciben arreglos de bytes. Podemos decir lo mismo con los métodos de almacenamiento de datos, el manejo de bytes es la forma más directa.</p>
<p>Para entender un poco más lo que hemos dicho hasta ahora, veamos un ejemplo:</p>
<p><pre class="brush: csharp;">public static byte[] Serialize(object objToSerialize)
{
    using (MemoryStream memStream = new MemoryStream())
    {
        BinaryFormatter binFormatter = new BinaryFormatter();
        binFormatter.Serialize(memStream, objToSerialize);

        return memStream.ToArray();
    }
}</pre></p>
<p>¿Se nota? Es realmente fácil serializar objetos en .Net.<br />
Para realizar el camino inverso, es decir, deserializar un objeto:</p>
<p><pre class="brush: csharp;">public static object Deserialize(byte[] objToDeserialize)
{
    using (MemoryStream memStream = new MemoryStream(objToDeserialize))
    {
        BinaryFormatter binFormatter = new BinaryFormatter();
        memStream.Position = 0;

        return binFormatter.Deserialize(memStream);
    }
}</pre></p>
<p>Casi me olvido, para poder serializar una clase debemos marcarla con el atributo <strong>[Serializable]</strong>, el cual no se puede heredar.</p>
<p>Más adelante veremos como enviar y recibir objetos serializados sobre internet (o una LAN).</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/datapayasadas.wordpress.com/330/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/datapayasadas.wordpress.com/330/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/datapayasadas.wordpress.com/330/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/datapayasadas.wordpress.com/330/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/datapayasadas.wordpress.com/330/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/datapayasadas.wordpress.com/330/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/datapayasadas.wordpress.com/330/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/datapayasadas.wordpress.com/330/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/datapayasadas.wordpress.com/330/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/datapayasadas.wordpress.com/330/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/datapayasadas.wordpress.com/330/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/datapayasadas.wordpress.com/330/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/datapayasadas.wordpress.com/330/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/datapayasadas.wordpress.com/330/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=datapayasadas.wordpress.com&amp;blog=3707397&amp;post=330&amp;subd=datapayasadas&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://datapayasadas.wordpress.com/2010/04/01/serializando-y-deserializando-objetos/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/498533c930f074f8a973101b65a22d0c?s=96&#38;d=" medium="image">
			<media:title type="html">matias</media:title>
		</media:content>
	</item>
		<item>
		<title>Superamos las 10.000 visitas!</title>
		<link>http://datapayasadas.wordpress.com/2010/03/03/superamos-las-10-000-visitas/</link>
		<comments>http://datapayasadas.wordpress.com/2010/03/03/superamos-las-10-000-visitas/#comments</comments>
		<pubDate>Wed, 03 Mar 2010 17:41:03 +0000</pubDate>
		<dc:creator>pabloide86</dc:creator>
				<category><![CDATA[Boludeces]]></category>

		<guid isPermaLink="false">http://datapayasadas.wordpress.com/?p=322</guid>
		<description><![CDATA[¡Hemos superado la marca de las 10.000 visitas! Cuando empezamos con Matías, jamas nos imaginamos que ibamos a lograr algo así! Si bien pueden parecer pocas comparado con otros blogs mucho mas grosos, para nosotros es todo un logro! Y todo gracias a ustedes! Esperamos seguir creciendo! Vamos a ver si llegamos a las 20.000! [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=datapayasadas.wordpress.com&amp;blog=3707397&amp;post=322&amp;subd=datapayasadas&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>¡Hemos superado la marca de las 10.000 visitas!</p>
<p>Cuando empezamos con Matías, jamas nos imaginamos que ibamos a lograr algo así! Si bien pueden parecer pocas comparado con otros blogs mucho mas grosos, para nosotros es todo un logro! Y todo gracias a ustedes!</p>
<p>Esperamos seguir creciendo! Vamos a ver si llegamos a las 20.000! trataremos de seguir posteando cosas interesantes y de servirles de ayuda!</p>
<p>Un abrazo a todos!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/datapayasadas.wordpress.com/322/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/datapayasadas.wordpress.com/322/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/datapayasadas.wordpress.com/322/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/datapayasadas.wordpress.com/322/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/datapayasadas.wordpress.com/322/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/datapayasadas.wordpress.com/322/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/datapayasadas.wordpress.com/322/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/datapayasadas.wordpress.com/322/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/datapayasadas.wordpress.com/322/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/datapayasadas.wordpress.com/322/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/datapayasadas.wordpress.com/322/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/datapayasadas.wordpress.com/322/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/datapayasadas.wordpress.com/322/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/datapayasadas.wordpress.com/322/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=datapayasadas.wordpress.com&amp;blog=3707397&amp;post=322&amp;subd=datapayasadas&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://datapayasadas.wordpress.com/2010/03/03/superamos-las-10-000-visitas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6f7927a7c2c6558264298a1350df50c8?s=96&#38;d=" medium="image">
			<media:title type="html">Gnanduuu</media:title>
		</media:content>
	</item>
		<item>
		<title>Entity Framework: The version of SQL Server in use does not support datatype &#8216;datetime2&#8242;.</title>
		<link>http://datapayasadas.wordpress.com/2010/02/16/entity-framework-the-version-of-sql-server-in-use-does-not-support-datatype-datetime2/</link>
		<comments>http://datapayasadas.wordpress.com/2010/02/16/entity-framework-the-version-of-sql-server-in-use-does-not-support-datatype-datetime2/#comments</comments>
		<pubDate>Tue, 16 Feb 2010 13:09:33 +0000</pubDate>
		<dc:creator>pabloide86</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[datetime2]]></category>
		<category><![CDATA[Entity Framework]]></category>
		<category><![CDATA[SQL 2008]]></category>

		<guid isPermaLink="false">http://datapayasadas.wordpress.com/?p=319</guid>
		<description><![CDATA[Holasss amigosss! Dando los primeros pasos con Entity Framework me encontré con el siguiente error: The version of SQL Server in use does not support datatype &#8216;datetime2&#8242;. Googleando un poco encontré el siguiente artículo el cual voy a resumir y traducir: Éste error se produce cuando generamos el Modelo a partir de SQL 2008 y [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=datapayasadas.wordpress.com&amp;blog=3707397&amp;post=319&amp;subd=datapayasadas&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Holasss amigosss! Dando los primeros pasos con Entity Framework me encontré con el siguiente error:</p>
<blockquote><p>The version of SQL Server in use does not support datatype &#8216;datetime2&#8242;.</p></blockquote>
<p>Googleando un poco encontré el <a href="http://alexduggleby.com/2008/08/11/entity-data-model-generated-against-sql-2008-used-against-sql-2005/">siguiente artículo</a> el cual voy a resumir y traducir:</p>
<p>Éste error se produce cuando generamos el Modelo a partir de SQL 2008 y luego utilizamos SQL 2005&#8230; es decir, Visual Studio genera el modelo por única vez basándose en los tipos de datos de SQL 2008 (que incorpora date y datetime2). Al cambiar el conection string de la conexión a SQL se produce éste error ya que el modelo no se actualiza solo.</p>
<p>Para actualizarlo a mano es sencillo:</p>
<ol>
<li>Dentro de la solución de Visual Studio hacer click derecho sobre el archivo EDMX y hacer click en &#8220;Open with&#8230;&#8221;</li>
<li>Seleccionar la opción XML Editor</li>
<li>Modificar el valor del atributo ProviderManifestToken de 2008 a 2005</li>
<li>Volver a compilar y listo</li>
</ol>
<p>De todas formas es siempre recomendable utilizar la misma configuración en todos los entornos (desarrollo, testing y producción) pero hay casos en que no es posible&#8230;</p>
<p>Espero que les haya servido&#8230;saludos!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/datapayasadas.wordpress.com/319/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/datapayasadas.wordpress.com/319/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/datapayasadas.wordpress.com/319/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/datapayasadas.wordpress.com/319/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/datapayasadas.wordpress.com/319/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/datapayasadas.wordpress.com/319/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/datapayasadas.wordpress.com/319/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/datapayasadas.wordpress.com/319/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/datapayasadas.wordpress.com/319/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/datapayasadas.wordpress.com/319/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/datapayasadas.wordpress.com/319/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/datapayasadas.wordpress.com/319/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/datapayasadas.wordpress.com/319/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/datapayasadas.wordpress.com/319/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=datapayasadas.wordpress.com&amp;blog=3707397&amp;post=319&amp;subd=datapayasadas&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://datapayasadas.wordpress.com/2010/02/16/entity-framework-the-version-of-sql-server-in-use-does-not-support-datatype-datetime2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6f7927a7c2c6558264298a1350df50c8?s=96&#38;d=" medium="image">
			<media:title type="html">Gnanduuu</media:title>
		</media:content>
	</item>
		<item>
		<title>Feliz Cumpleaños Pabloide!</title>
		<link>http://datapayasadas.wordpress.com/2010/01/19/feliz-cumpleanos-pabloide/</link>
		<comments>http://datapayasadas.wordpress.com/2010/01/19/feliz-cumpleanos-pabloide/#comments</comments>
		<pubDate>Tue, 19 Jan 2010 14:18:08 +0000</pubDate>
		<dc:creator>Matías</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://datapayasadas.wordpress.com/2010/01/19/feliz-cumpleanos-pabloide/</guid>
		<description><![CDATA[Te deseamos con todo el equipo detrás de Datapayasadas (?!) lo mejor en tu día!, cuidado con comer mucha torta con el calor que está haciendo estos días puede caer media pesadita. Que la pases bien!<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=datapayasadas.wordpress.com&amp;blog=3707397&amp;post=316&amp;subd=datapayasadas&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Te deseamos con todo el equipo detrás de Datapayasadas (?!) lo mejor en tu día!, cuidado con comer mucha torta con el calor que está haciendo estos días puede caer media pesadita.<br />
Que la pases bien!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/datapayasadas.wordpress.com/316/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/datapayasadas.wordpress.com/316/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/datapayasadas.wordpress.com/316/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/datapayasadas.wordpress.com/316/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/datapayasadas.wordpress.com/316/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/datapayasadas.wordpress.com/316/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/datapayasadas.wordpress.com/316/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/datapayasadas.wordpress.com/316/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/datapayasadas.wordpress.com/316/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/datapayasadas.wordpress.com/316/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/datapayasadas.wordpress.com/316/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/datapayasadas.wordpress.com/316/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/datapayasadas.wordpress.com/316/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/datapayasadas.wordpress.com/316/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=datapayasadas.wordpress.com&amp;blog=3707397&amp;post=316&amp;subd=datapayasadas&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://datapayasadas.wordpress.com/2010/01/19/feliz-cumpleanos-pabloide/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/498533c930f074f8a973101b65a22d0c?s=96&#38;d=" medium="image">
			<media:title type="html">matias</media:title>
		</media:content>
	</item>
	</channel>
</rss>
