<?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:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Luciano Carvalho</title>
	<atom:link href="http://lucianocarvalho.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://lucianocarvalho.wordpress.com</link>
	<description>Luciano é desenvolvedor .NET com certificação MCPD WebDeveloper Asp.Net WebApplications 2.0</description>
	<lastBuildDate>Tue, 16 Sep 2008 03:18:23 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='lucianocarvalho.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/fbaf70502f50f2506805dcd85fcfccef?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Luciano Carvalho</title>
		<link>http://lucianocarvalho.wordpress.com</link>
	</image>
			<item>
		<title>Restringir acesso à métodos da aplicação.</title>
		<link>http://lucianocarvalho.wordpress.com/2008/09/16/restringir-acesso-a-metodos-da-aplicacao/</link>
		<comments>http://lucianocarvalho.wordpress.com/2008/09/16/restringir-acesso-a-metodos-da-aplicacao/#comments</comments>
		<pubDate>Tue, 16 Sep 2008 03:02:45 +0000</pubDate>
		<dc:creator>Luciano Carvalho</dc:creator>
				<category><![CDATA[.Net Framework]]></category>
		<category><![CDATA[acesso a método]]></category>
		<category><![CDATA[Principal Permisson]]></category>
		<category><![CDATA[RBS Demands]]></category>
		<category><![CDATA[Role-Based Security]]></category>

		<guid isPermaLink="false">http://lucianocarvalho.wordpress.com/?p=28</guid>
		<description><![CDATA[Demandas RBS declarativas instruem o runtime a executar uma checagem RBS antes de rodar um método. É a forma mais segura de usar RBS para restringir acesso a código. Existem duas desvantagens para este modo:



Somente pode ser usado para restringir acesso a métodos inteiros.


Podem resultar em uma exceção em runtime. Se o método foi chamado [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lucianocarvalho.wordpress.com&blog=3800458&post=28&subd=lucianocarvalho&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Demandas RBS declarativas instruem o runtime a executar uma checagem RBS antes de rodar um método. É a forma mais segura de usar RBS para restringir acesso a código. Existem duas desvantagens para este modo:<span style="color:#008080;"><em><strong><br />
</strong></em></span></p>
<ul>
<li>
<address><span style="color:#3366ff;"><em><strong>Somente pode ser usado para restringir acesso a métodos inteiros.</strong></em></span></address>
</li>
<li>
<address><span style="color:#3366ff;"><em><strong>Podem resultar em uma exceção em runtime. Se o método foi chamado por um evento do windows, a exceção é lançada e sua aplicação pode parar.</strong></em></span></address>
</li>
</ul>
<p>Para usar demanda RBS declarativa, seu código precisa ter 3 elementos:</p>
<ul>
<li>
<address><strong><span style="color:#3366ff;">O método System.AppDomain.CurrentDomain.SetPrincipalPolicy para especificar a política de segurança.</span></strong></address>
</li>
<li>
<address><strong><span style="color:#3366ff;">Um bloco Try/Catch para tratar tentativas de acesso sem sucesso e para reportar erros.</span></strong></address>
</li>
<li>
<address><strong><span style="color:#3366ff;">Um atributo PrincipalPermission para declarar requisitos de acesso ao método.</span></strong></address>
</li>
</ul>
<p>Para aplicar o atributo, você precisa definir duas coisas antes:</p>
<ul>
<li>
<address><span style="color:#3366ff;"><strong>A ação que PrincipalPermission terá, que é conseguida através da enumeração SecurityAction. Geralmente usamos SecurityAction.Demand para RBS.</strong></span></address>
</li>
<li>
<address><span style="color:#3366ff;"><strong>Uma ou mais propriedades da classe PrincipalPermission. Use Authenticated para restringir acesso a usuários autenticados, Role para grupos e User para usuários.</strong></span><br />
</address>
</li>
</ul>
<p>Neste código que segue, eu quero lançar uma exceção caso o usuário que esteja tentando executar o método FazerPagamento() não pertença ao grupo de administradores:<br />
[<span style="color:#008080;">PrincipalPermission<span style="color:#000000;">(</span>SecurityAction.Demand</span>, Role = <span style="color:#800000;">@"BUILTIN\Administradores"</span>)]<br />
<span style="color:#0000ff;">static void</span> FazerPagamento()<br />
{<br />
<span style="color:#008000;">//Qualquer código aqui.</span><br />
}</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/lucianocarvalho.wordpress.com/28/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/lucianocarvalho.wordpress.com/28/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/lucianocarvalho.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/lucianocarvalho.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/lucianocarvalho.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/lucianocarvalho.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/lucianocarvalho.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/lucianocarvalho.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/lucianocarvalho.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/lucianocarvalho.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/lucianocarvalho.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/lucianocarvalho.wordpress.com/28/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lucianocarvalho.wordpress.com&blog=3800458&post=28&subd=lucianocarvalho&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://lucianocarvalho.wordpress.com/2008/09/16/restringir-acesso-a-metodos-da-aplicacao/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/407bcd7a2b8f11259fed715ee5f6aca8?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Luciano Carvalho</media:title>
		</media:content>
	</item>
		<item>
		<title>Assertividade no .NET</title>
		<link>http://lucianocarvalho.wordpress.com/2008/08/26/assertividade-no-net/</link>
		<comments>http://lucianocarvalho.wordpress.com/2008/08/26/assertividade-no-net/#comments</comments>
		<pubDate>Tue, 26 Aug 2008 04:30:12 +0000</pubDate>
		<dc:creator>Luciano Carvalho</dc:creator>
				<category><![CDATA[.Net Framework]]></category>
		<category><![CDATA[.net debug]]></category>
		<category><![CDATA[Assert]]></category>
		<category><![CDATA[assertion]]></category>
		<category><![CDATA[assertividade]]></category>
		<category><![CDATA[breakpoint]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[debug automático]]></category>

		<guid isPermaLink="false">http://lucianocarvalho.wordpress.com/?p=16</guid>
		<description><![CDATA[Você já se encontrou em situações que perdia minutos preciosos tendo de debugar código?
Imagine aquele laço for{} interminável, em que algo está dando errado mas que você precisa debugar até encontrar o ponto da iteração onde a variável que devia trazer um inteiro, traz um null! 
Para evitar essa perda de tempo, o .NET fornece, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lucianocarvalho.wordpress.com&blog=3800458&post=16&subd=lucianocarvalho&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><h1 style="margin:24pt 0 0;"><span style="font-size:small;font-family:Calibri;">Você já se encontrou em situações que perdia minutos preciosos tendo de debugar código?</span></h1>
<p class="MsoNormal" style="margin:0 0 10pt;"><span style="font-size:small;font-family:Calibri;">Imagine aquele laço for{} interminável, em que algo está dando errado mas que você precisa debugar até encontrar o ponto da iteração onde a variável que devia trazer um inteiro, traz um null! </span></p>
<p class="MsoNormal" style="margin:0 0 10pt;"><span style="font-size:small;font-family:Calibri;">Para evitar essa perda de tempo, o .NET fornece, na classe <em><span style="color:#4bacc6;">Debug</span></em>, o método <em><span style="color:#4bacc6;">Assert()</span></em>. Este método permite que você use uma condição para que o Runtime faça um Break durante a execução da aplicação. Embora neste exemplo sejam apenas três itens, imagine que você tenha um for{} percorrendo centenas de registros, seria muito útil usar algo como isto:</span></p>
<p class="MsoNormal" style="text-align:center;margin:0 0 10pt;"> <img class="alignnone size-large wp-image-20" src="http://lucianocarvalho.files.wordpress.com/2008/08/codigo_assert1.gif?w=510&#038;h=125" alt="" width="510" height="125" /></p>
<p class="MsoNormal" style="text-align:center;margin:0 0 10pt;"><span style="font-size:small;font-family:Calibri;">O primeiro parâmetro do método é a condição em que o código vai sofrer o Break. Isto só acontecerá quando a condição for False. Aqui, eu quero ter certeza que os indices sempre guardem algum texto. Neste caso, você terá algo parecido com isto:</span></p>
<p class="MsoNormal" style="margin:0 0 10pt;">                                                                      <img class="alignnone size-full wp-image-21" src="http://lucianocarvalho.files.wordpress.com/2008/08/msg_assert1.gif?w=418&#038;h=307" alt="" width="418" height="307" /></p>
<p class="MsoNormal" style="margin:0 0 10pt;"><span style="font-size:small;font-family:Calibri;">Você deve estar se perguntando: Os usuários terão de ver essa tela feia? Não, eles não precisam passar por isto. Basta que você configure o Build do projeto para Release, quando for entregá-lo e estes comandos da classe Debug nem serão compilados. </span></p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/lucianocarvalho.wordpress.com/16/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/lucianocarvalho.wordpress.com/16/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/lucianocarvalho.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/lucianocarvalho.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/lucianocarvalho.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/lucianocarvalho.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/lucianocarvalho.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/lucianocarvalho.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/lucianocarvalho.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/lucianocarvalho.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/lucianocarvalho.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/lucianocarvalho.wordpress.com/16/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lucianocarvalho.wordpress.com&blog=3800458&post=16&subd=lucianocarvalho&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://lucianocarvalho.wordpress.com/2008/08/26/assertividade-no-net/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/407bcd7a2b8f11259fed715ee5f6aca8?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Luciano Carvalho</media:title>
		</media:content>

		<media:content url="http://lucianocarvalho.files.wordpress.com/2008/08/codigo_assert1.gif?w=510" medium="image" />

		<media:content url="http://lucianocarvalho.files.wordpress.com/2008/08/msg_assert1.gif" medium="image" />
	</item>
		<item>
		<title>Monitorando a aplicação com Logs de Eventos</title>
		<link>http://lucianocarvalho.wordpress.com/2008/06/25/monitorando-a-aplicacao-com-logs-de-eventos/</link>
		<comments>http://lucianocarvalho.wordpress.com/2008/06/25/monitorando-a-aplicacao-com-logs-de-eventos/#comments</comments>
		<pubDate>Wed, 25 Jun 2008 02:25:37 +0000</pubDate>
		<dc:creator>Luciano Carvalho</dc:creator>
				<category><![CDATA[.Net Framework]]></category>
		<category><![CDATA[event viewer]]></category>
		<category><![CDATA[instrumentation]]></category>
		<category><![CDATA[logs]]></category>
		<category><![CDATA[segurança]]></category>

		<guid isPermaLink="false">http://lucianocarvalho.wordpress.com/?p=7</guid>
		<description><![CDATA[Não importa o quanto bem codificada e testada é uma aplicação, é muito provável que ela tenha erros ou algum comportamento inesperado. Muitas vezes, os usuários reportam erros ao desenvolvedor em uma linguagem a qual fica difícil saber o que acontece com o sistema. 
Versões recentes do Windows trazem recursos úteis para sabermos o que [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lucianocarvalho.wordpress.com&blog=3800458&post=7&subd=lucianocarvalho&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p class="MsoNormal" style="margin:0 0 10pt;"><span style="font-size:10pt;line-height:115%;">Não importa o quanto bem codificada e testada é uma aplicação, é muito provável que ela tenha erros ou algum comportamento inesperado. Muitas vezes, os usuários reportam erros ao desenvolvedor em uma linguagem a qual fica difícil saber o que acontece com o sistema. </span></p>
<p class="MsoNormal" style="margin:0 0 10pt;"><span style="font-size:10pt;line-height:115%;">Versões recentes do Windows trazem recursos úteis para sabermos o que acontece nos sistemas. Os eventos de log são úteis para que o desenvolvedor registre certos aspectos do estado das aplicações, incluindo erros bastante sérios. </span></p>
<p class="MsoNormal" style="margin:0 0 10pt;"><span style="font-size:10pt;line-height:115%;">Porém, o uso de Eventos de Log traz algumas desvantagens:</span></p>
<p class="MsoListParagraphCxSpFirst" style="text-indent:-18pt;margin:0 0 0 36pt;"><span style="font-size:10pt;line-height:115%;font-family:Wingdings;"><span>ü<span style="font:7pt;">  </span></span></span><span style="font-size:10pt;line-height:115%;">Objetos EventLog, incluindo EventLogEntry e EventLogEntryCollection nunca devem ser passados a códigos menos confiáveis. É importante estar ciente do contexto em que esses objetos serão executados.</span></p>
<p class="MsoListParagraphCxSpMiddle" style="text-indent:-18pt;margin:0 0 0 36pt;"><span style="font-size:10pt;line-height:115%;font-family:Wingdings;"><span>ü<span style="font:7pt;">  </span></span></span><span style="font-size:10pt;line-height:115%;">A classe EventLogPermission é requerida em muitas ações nas quais há uso da classe EventLog. Conceder essa permissão a códigos parcialmente confiáveis pode abrir sérias vulnerabilidades de segurança. </span></p>
<p class="MsoListParagraphCxSpLast" style="text-indent:-18pt;margin:0 0 10pt 36pt;"><span style="font-size:10pt;line-height:115%;font-family:Wingdings;"><span>ü<span style="font:7pt;">  </span></span></span><span style="font-size:10pt;line-height:115%;">Ler e registrar eventos consome recursos relativamente grandes em termos de utilização do disco, processador e outros recursos. Objetos EventLog devem ser usados quando necessários.</span></p>
<p class="MsoNormal" style="margin:0 0 10pt;"><strong><span><span style="font-size:small;">Criando e deletando um Log de Eventos</span></span></strong></p>
<p class="MsoNormal" style="margin:0 0 10pt;"><span><span style="font-size:small;font-family:Calibri;">                </span></span><span style="font-size:10pt;line-height:115%;">Para criar um log de eventos, o Framework .Net fornece a classe EventLog. Para usá-la, a propriedade Source precisa ser especificada e uma mensagem precisa ser registrada, como mostra o código seguinte, que requer uma referencia ao namespace System.Diagnostics:</span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-size:10pt;color:#0000ff;">public</span><span style="font-size:10pt;" lang="EN-US"> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">void</span> CriandoEventoLog()</span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-size:10pt;" lang="EN-US">{</span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-size:10pt;" lang="EN-US"><span>   </span><span style="color:#2b91af;">EventLog</span> MeuLog = <span style="color:#0000ff;">new</span> <span style="color:#2b91af;">EventLog</span>(<span style="color:#a31515;">&#8220;LogEventoTeste&#8221;</span>);</span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-size:10pt;" lang="EN-US"><span>   </span>MeuLog.Source = <span style="color:#a31515;">&#8220;LogEventoTeste&#8221;</span>;</span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-size:10pt;" lang="EN-US"><span>   </span>MeuLog.WriteEntry(<span style="color:#a31515;">&#8220;CriaEventoLog chamado&#8221;</span>, <span>  </span><span style="color:#2b91af;">EventLogEntryType</span>.Information);<span>   </span></span></p>
<p class="MsoNormal" style="margin:0 0 10pt;"><span style="font-size:10pt;line-height:115%;">}</span></p>
<p class="MsoNormal" style="margin:0 0 10pt;"><span style="font-size:10pt;line-height:115%;">Depois de criar um objeto EventLog e especificar a propriedade Source, informações sobre o objeto podem ser vistas na janela de eventos do Windows. </span></p>
<p class="MsoNormal" style="margin:0 0 10pt;"><span style="font-size:10pt;line-height:115%;">Deletar um Log é tão simples quanto. Para remover o log de demonstração, use o metodo <em>Delete</em>, da classe EventLog:</span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-size:10pt;color:#0000ff;">public</span><span style="font-size:10pt;"> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">void</span> DeletaLogEvento()</span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-size:10pt;">{</span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-size:10pt;"><span>   </span><span style="color:#2b91af;">EventLog</span>.Delete(<span style="color:#a31515;">&#8220;LogEventoTeste&#8221;</span>);</span></p>
<p class="MsoNormal" style="margin:0 0 10pt;"><span style="font-size:10pt;line-height:115%;">}</span></p>
<p class="MsoNormal" style="margin:0 0 10pt;"><span style="font-size:10pt;line-height:115%;">Tenha certeza se você deseja remover informações valiosas com esse método!</span></p>
<p class="MsoNormal" style="margin:0 0 10pt;"><strong><span><span style="font-size:small;">Escrevendo em um Log de Eventos</span></span></strong></p>
<p class="MsoNormal" style="margin:0 0 10pt;"><span style="font-size:10pt;line-height:115%;">Você só precisou de poucas linhas de código para escrever no arquivo de log:</span></p>
<p class="MsoNormal" style="margin:0 0 10pt;"><span style="font-size:10pt;line-height:115%;" lang="EN-US">MeuLog.WriteEntry(<span style="color:#a31515;">&#8220;CriaEventoLog chamado&#8221;</span>, <span style="color:#2b91af;">EventLogEntryType</span>.Information);</span></p>
<p class="MsoNormal" style="margin:0 0 10pt;"><span style="font-size:10pt;line-height:115%;">O método <em>WriteEntry</em> parece ser muito simples, mas ele tem dez sobrecargas! Além de poder manipular Eventos de Log da sua própria aplicação, a classe <em>EventLog </em>também permite ler e escrever nos eventos do Windows (Aplicação, Segurança e Logs do Sistema).<span>  </span>O código seguinte mostra como usar esses Logs (lembre-se de que você deve ter permissões para tal).</span></p>
<p class="MsoNormal" style="margin:0 0 10pt;"><span style="font-size:10pt;line-height:115%;">Escrevendo em Log de Aplicação:</span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-size:10pt;color:#0000ff;">public</span><span style="font-size:10pt;" lang="EN-US"> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">void</span> EscreverLogAplicacao()</span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-size:10pt;" lang="EN-US">{</span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-size:10pt;" lang="EN-US"><span>   </span><span style="color:#2b91af;">EventLog</span> AppLog = <span style="color:#0000ff;">new</span> <span style="color:#2b91af;">EventLog</span>(<span style="color:#a31515;">&#8220;Application&#8221;</span>);</span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-size:10pt;" lang="EN-US"><span>   </span></span><span style="font-size:10pt;">AppLog.Source = <span style="color:#a31515;">&#8220;DemoLogAplicacao&#8221;</span>;</span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-size:10pt;"><span>   </span>AppLog.WriteEntry(<span style="color:#a31515;">&#8220;Escrevendo em Log de Aplicação&#8221;</span>, <span style="color:#2b91af;">EventLogEntryType</span>.Information);</span></p>
<p class="MsoNormal" style="margin:0 0 10pt;"><span style="font-size:10pt;line-height:115%;">}</span></p>
<p class="MsoNormal" style="margin:0 0 10pt;"><span style="font-size:10pt;line-height:115%;">Escrevendo em Log de Segurança:</span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-size:10pt;color:#0000ff;">public</span><span style="font-size:10pt;"> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">void</span> EscrevendoLogSeguranca()</span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-size:10pt;">{</span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-size:10pt;"><span>  </span><span> </span><span style="color:#2b91af;">EventLog</span> AppSeguranca = <span style="color:#0000ff;">new</span> <span style="color:#2b91af;">EventLog</span>(<span style="color:#a31515;">&#8220;Security&#8221;</span>);</span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-size:10pt;"><span>   </span>AppSeguranca.Source = <span style="color:#a31515;">&#8220;DemoLogSeguranca&#8221;</span>;</span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-size:10pt;"><span>   </span>AppSeguranca.WriteEntry(<span style="color:#a31515;">&#8220;Ocorreu um ataque de trojan ao sistema do seguinte IP: 192.168.0.1&#8243;</span>, <span style="color:#2b91af;">EventLogEntryType</span>.Warning);</span></p>
<p class="MsoNormal" style="margin:0 0 10pt;"><span style="font-size:10pt;line-height:115%;">}</span></p>
<p class="MsoNormal" style="margin:0 0 10pt;"><span style="font-size:10pt;line-height:115%;">Escrevendo em Log de Sistema:</span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-size:10pt;color:#0000ff;">public</span><span style="font-size:10pt;"> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">void</span> EscrevendoLogSistema()</span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-size:10pt;">{</span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-size:10pt;"><span>   </span><span style="color:#2b91af;">EventLog</span> AppSistema = <span style="color:#0000ff;">new</span> <span style="color:#2b91af;">EventLog</span>(<span style="color:#a31515;">&#8220;System&#8221;</span>);</span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-size:10pt;"><span>   </span>AppSistema.Source = <span style="color:#a31515;">&#8220;DemoLogSistema&#8221;</span>;</span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-size:10pt;"><span>   </span>AppSistema.WriteEntry(<span style="color:#a31515;">&#8220;O serviço será inicializado assim que o Windows for reinicializado.&#8221;</span>, <span style="color:#2b91af;">EventLogEntryType</span>.Information);</span></p>
<p class="MsoNormal" style="margin:0 0 10pt;"><span style="font-size:10pt;line-height:115%;">}</span></p>
<p class="MsoNormal" style="margin:0 0 10pt;"><span style="font-size:10pt;line-height:115%;">Até agora, um log de eventos foi criado e escrevemos informações nele. A classe EventLog tem uma propriedade <em>Entries</em>, a qual é uma instancia de <em>EventLogEntryCollection</em>, e contém objetos <em>EventLogEntry</em>. Depois que você obter uma instancia da sua classe EventLog, você pode iteragir pelas entradas de logs, como mostra o seguinte código:</span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-size:10pt;color:#0000ff;">public</span><span style="font-size:10pt;" lang="EN-US"> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">void</span> LendoLogEventos()</span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-size:10pt;" lang="EN-US">{</span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-size:10pt;" lang="EN-US"><span>   </span><span style="color:#2b91af;">EventLog</span> LogEventos = <span style="color:#0000ff;">new</span> <span style="color:#2b91af;">EventLog</span>();</span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-size:10pt;" lang="EN-US"><span>   </span>LogEventos.Log = <span style="color:#a31515;">&#8220;LogSistema&#8221;</span>;</span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-size:10pt;" lang="EN-US"><span>   </span><span style="color:#0000ff;">foreach</span> (<span style="color:#2b91af;">EventLogEntry</span> LogEntry <span style="color:#0000ff;">in</span> LogEventos.Entries)</span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-size:10pt;" lang="EN-US"><span>   </span>{</span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-size:10pt;" lang="EN-US"><span>      </span><span style="color:#2b91af;">Console</span>.WriteLine(LogEntry.Source + <span style="color:#a31515;">&#8220;:&#8221;</span> + LogEntry.Message);</span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-size:10pt;" lang="EN-US"><span>   </span></span><span style="font-size:10pt;">}</span></p>
<p class="MsoNormal" style="margin:0 0 10pt;"><span style="font-size:10pt;line-height:115%;">}</span></p>
<p class="MsoNormal" style="margin:0 0 10pt;"><span style="font-size:10pt;line-height:115%;">Para limpar o log usamos o metodo <em>Clear </em>da classe <em>EventLog</em>:</span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-size:10pt;color:#0000ff;">public</span><span style="font-size:10pt;" lang="EN-US"> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">void</span> ApagarLog()</span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-size:10pt;" lang="EN-US">{</span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-size:10pt;" lang="EN-US"><span>   </span><span style="color:#2b91af;">EventLog</span> ApagaLog = <span style="color:#0000ff;">new</span> <span style="color:#2b91af;">EventLog</span>(<span style="color:#a31515;">&#8220;LogDemo&#8221;</span>);</span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-size:10pt;" lang="EN-US"><span> </span><span>  </span></span><span style="font-size:10pt;">ApagaLog.Source = <span style="color:#a31515;">&#8220;ApagaLogDemo&#8221;</span>;</span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-size:10pt;"><span>   </span>ApagaLog.Clear();</span></p>
<p class="MsoNormal" style="margin:0 0 10pt;"><span style="font-size:10pt;line-height:115%;"><span> </span>}</span></p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/lucianocarvalho.wordpress.com/7/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/lucianocarvalho.wordpress.com/7/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/lucianocarvalho.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/lucianocarvalho.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/lucianocarvalho.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/lucianocarvalho.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/lucianocarvalho.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/lucianocarvalho.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/lucianocarvalho.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/lucianocarvalho.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/lucianocarvalho.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/lucianocarvalho.wordpress.com/7/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lucianocarvalho.wordpress.com&blog=3800458&post=7&subd=lucianocarvalho&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://lucianocarvalho.wordpress.com/2008/06/25/monitorando-a-aplicacao-com-logs-de-eventos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/407bcd7a2b8f11259fed715ee5f6aca8?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Luciano Carvalho</media:title>
		</media:content>
	</item>
		<item>
		<title>Criando Templated Controls</title>
		<link>http://lucianocarvalho.wordpress.com/2008/05/23/criando-templated-controls/</link>
		<comments>http://lucianocarvalho.wordpress.com/2008/05/23/criando-templated-controls/#comments</comments>
		<pubDate>Fri, 23 May 2008 18:26:30 +0000</pubDate>
		<dc:creator>Luciano Carvalho</dc:creator>
				<category><![CDATA[.Net Framework]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[controles personalizados]]></category>
		<category><![CDATA[Templated Controls]]></category>
		<category><![CDATA[user controls]]></category>
		<category><![CDATA[webcontrols]]></category>

		<guid isPermaLink="false">http://lucianocarvalho.wordpress.com/?p=5</guid>
		<description><![CDATA[Imagine que você precise criar um User Control, porém, precisa permitir que o desenvolvedor defina como ele será exibido na página.
Imagine que você não saiba como seu controle aparecerá na tela do usuário, onde somente o desenvolvedor, em tempo de design, definirá isso. Isto significa que não podemos incluir no nosso controle nenhuma Texbox, Labels, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lucianocarvalho.wordpress.com&blog=3800458&post=5&subd=lucianocarvalho&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Imagine que você precise criar um User Control, porém, precisa permitir que o desenvolvedor defina como ele será exibido na página.</p>
<p>Imagine que você não saiba como seu controle aparecerá na tela do usuário, onde somente o desenvolvedor, em tempo de design, definirá isso. Isto significa que não podemos incluir no nosso controle nenhuma Texbox, Labels, ou qualquer que seja outro controle. Não sabemos se os dados serão exibidos como link, caixas de texto ou áreas, por exemplo.</p>
<p>Templated User Controls resolve esta questão. Para criar um Templated User Control, você precisa de uma classe que implemente a interface INamingContainer e herde da classe Control. A interface INamingContainer define classes que são contêiners para controles, como as classes Page, Gridview e outras. Você precisa dela para quando quiser renderizar o mesmo controle várias vezes em tempo de execução.</p>
<p>Para criar seu Templated User Control, siga os seguintes passos:</p>
<p>Adicione um UserControl ao seu projeto e nomeie-o para PessoaControl.ascx<br />
Arraste um PlaceHolder ao arquivo .ascx e nomeie-o para PessoaHolder<br />
No CodeBehind do seu .ascx, adicione as propriedades Nome, Cidade e Idade à sua classe. Adicione também uma propriedade do tipo ITemplate.</p>
<p>public ITemplate PessoaTemplate<br />
{<br />
get { return _PessoaTemplate; }<br />
set { _PessoaTemplate = value; }<br />
}</p>
<p>private ITemplate _PessoaTemplate;</p>
<p>Na pasta App_Code, adicione uma classe chamada PessoaContainer, que será a classe implementada pela interface INamingContainer. Não esqueça que ela também herda da classe Control. Essa classe será usada pelo controle para exibir as propriedades na página. Portanto, defina as mesmas propriedades públicas que usou no CodeBehind do seu .ascx .</p>
<p>public class PessoaContainer:Control, INamingContainer<br />
{<br />
public PessoaContainer(string _nome, string _cidade, int _idade)<br />
{<br />
Nome = _nome;<br />
Cidade = _cidade;<br />
Idade = _idade;<br />
}<br />
private string _nome;<br />
public string Nome<br />
{<br />
get { return _nome; }<br />
set { _nome = value; }<br />
}<br />
private string _cidade;<br />
public string Cidade<br />
{<br />
get { return _cidade; }<br />
set { _cidade = value; }<br />
}<br />
private int _idade;<br />
public int Idade<br />
{<br />
get { return _idade; }<br />
set { _idade = value; }<br />
}<br />
}</p>
<p>Agora volte ao CodeBehind do seu controle e aplique os atributos TamplateContainer, passando a classe container PessoaContainer à ele e o atributo PersistenceMode.</p>
<p>[PersistenceMode(PersistenceMode.InnerProperty)]<br />
[TemplateContainer(typeof(PessoaContainer))]<br />
public ITemplate PessoaTemplate<br />
{<br />
get { return _PessoaTemplate; }<br />
set { _PessoaTemplate = value; }<br />
}</p>
<p>No método Page_Init() do controle, verifique se a propriedade PessoaTemplate está definida.<br />
Se estiver definida, instancie a classe container e crie uma instância do ItemTmplate dentro da classe container.</p>
<p>public void Page_Init()<br />
{<br />
PessoaHolder.Controls.Clear();<br />
if (PessoaTemplate == null)<br />
{<br />
PessoaHolder.Controls.Add(new LiteralControl(&#8220;Template não foi definido&#8221;));<br />
}</p>
<p>PessoaContainer pContainer = new PessoaContainer(Nome, Cidade, Idade);<br />
PessoaTemplate.InstantiateIn(pContainer);<br />
PessoaHolder.Controls.Add(pContainer);<br />
}</p>
<p>Agora adicione um webform no projeto e registre o controle:<br />
&lt;%@ Register TagName=&#8221;PessoaControl&#8221; TagPrefix=&#8221;uc1&#8243; Src=&#8221;~/PessoaControl.ascx&#8221; %&gt;</p>
<p>Adicione um controle à página e defina as propriedades. Veja que você pode formatar as informações do modo que puder, dentro da tag &lt;PessoaTemplate&gt;:</p>
<p>&lt;uc1:PessoaControl ID=&#8221;PessoaControl1&#8243; runat=&#8221;server&#8221; Nome=&#8221;Luciano Carvalho da Silva&#8221;<br />
Cidade=&#8221;Rio de Janeiro&#8221; Idade=&#8221;26&#8243; &gt;<br />
&lt;PessoaTemplate&gt;<br />
&lt;select id=&#8221;Select1&#8243;&gt;<br />
&lt;option&gt;&lt;%# Container.Nome %&gt;&lt;/option&gt;<br />
&lt;option&gt;&lt;%# Container.Cidade %&gt;&lt;/option&gt;<br />
&lt;option&gt;&lt;%# Container.Idade %&gt;&lt;/option&gt;<br />
&lt;/select&gt;<br />
&lt;/PessoaTemplate&gt;<br />
&lt;/uc1:PessoaControl&gt;</p>
<p>Chame o método DataBind() no Page_Load() da sua página.</p>
<p>Note que o controle não é exibido no Design. Mas se você executar a página, poderá ver as modificações.</p>
<p>Abraços, e até a próxima.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/lucianocarvalho.wordpress.com/5/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/lucianocarvalho.wordpress.com/5/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/lucianocarvalho.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/lucianocarvalho.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/lucianocarvalho.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/lucianocarvalho.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/lucianocarvalho.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/lucianocarvalho.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/lucianocarvalho.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/lucianocarvalho.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/lucianocarvalho.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/lucianocarvalho.wordpress.com/5/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lucianocarvalho.wordpress.com&blog=3800458&post=5&subd=lucianocarvalho&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://lucianocarvalho.wordpress.com/2008/05/23/criando-templated-controls/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/407bcd7a2b8f11259fed715ee5f6aca8?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Luciano Carvalho</media:title>
		</media:content>
	</item>
		<item>
		<title>Serializando objetos com SOAP.</title>
		<link>http://lucianocarvalho.wordpress.com/2008/05/23/serializando-objetos-com-soap-2/</link>
		<comments>http://lucianocarvalho.wordpress.com/2008/05/23/serializando-objetos-com-soap-2/#comments</comments>
		<pubDate>Fri, 23 May 2008 18:18:02 +0000</pubDate>
		<dc:creator>Luciano Carvalho</dc:creator>
				<category><![CDATA[.Net Framework]]></category>

		<guid isPermaLink="false">http://lucianocarvalho.wordpress.com/?p=3</guid>
		<description><![CDATA[Bom, primeiramente, sejam bem-vindos. Este é o primeiro post deste blog, que tem o intuito de discutir e avançar no aprendizado do Microsoft .Net Framework.
Hoje vou falar de Serialização de dados, um assunto um tanto extenso que daria muitos outros posts, se eu fosse falar sobre todos os meios de serializar objetos.
Mas o que é [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lucianocarvalho.wordpress.com&blog=3800458&post=3&subd=lucianocarvalho&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><span style="color:#333333;">Bom, primeiramente, sejam bem-vindos. Este é o primeiro post deste blog, que tem o intuito de discutir e avançar no aprendizado do Microsoft .Net Framework.<br />
Hoje vou falar de Serialização de dados, um assunto um tanto extenso que daria muitos outros posts, se eu fosse falar sobre todos os meios de serializar objetos.</span></p>
<p><span style="color:#333333;">Mas o que é serialização e quando vou precisar usar?</span></p>
<p><span style="color:#333333;">Quando você precisa converter seus objetos em documentos para serem usados por outros processos ou transmitidos pela rede, você os está serializando.<br />
Você precisará deste processo quando outras aplicações necessitarem obter informações dos seus objetos.</span></p>
<p><span style="color:#333333;">Existem dois formatos de serialização no namespace System.Runtime.Serialization :</span></p>
<p><span style="color:#333333;">* BinaryFormatter: Encontrado no namespace System.Runtime.Serialization.Formatters.Binary . É o meio mais eficiente de serialização, utilizado quando os objetos serão lidos por aplicações desenvolvidas no .Net Framework.<br />
* SOAP Formatter: Encontrado no namespace System.Runtime.Serialization.Formatters.Soap . Formato baseado no XML, mais útil para aplicações não desenvolvidas no .Net e para transferir dados por redes, pois é o formato que tem mais sucesso contra bloqueios de firewalls que o BinaryFormatter.Hoje vou falar sobre o SOAPFormatter. Em breve, mostro o funcionamento do BinaryFormatter.</span></p>
<p><span style="color:#333333;">Para usar o SOAPFormatter, adicione uma referência ao System.Runtime.Serialization.Formatters.Soap.dll no seu projeto. Os passos básicos para serializar neste formato são os seguintes:</span></p>
<p><span style="color:#333333;">* Crie um stream para salvar a saída no disco;<br />
* Crie um objeto SOAPFormatter;<br />
* Use o SOAPFormatter.Serialize() para serializar os dados no arquivo.</span></p>
<p><span style="color:#333333;">Primeiro, vamos criar nossa classe que será serializada. Para tornar uma classe serializável, aplique o atributo [Serializable] à ela.</span></p>
<p><span style="color:#333333;">using System;<br />
using System.Collections.Generic;<br />
using System.Text;<br />
using System.Runtime.Serialization;</span></p>
<p><span style="color:#333333;">namespace Serializa_Funcionario<br />
{<br />
[Serializable]<br />
class Funcionario<br />
{<br />
public string nome;<br />
public DateTime dataNascimento;<br />
public int idade;</span></p>
<p><span style="color:#333333;">public Funcionario(string _nome, DateTime _dataNascimento, int _idade)<br />
{<br />
nome = _nome;<br />
dataNascimento = _dataNascimento;<br />
idade = _idade;<br />
}</span></p>
<p><span style="color:#333333;">public Funcionario() {}</span></p>
<p><span style="color:#333333;">public override string ToString()<br />
{<br />
return nome + &#8221; nasceu em &#8221; + dataNascimento.ToShortDateString() + &#8221; e tem &#8221; + idade.ToString() + &#8221; anos de idade&#8221;;<br />
}</span></p>
<p><span style="color:#333333;">}<br />
}</span></p>
<p><span style="color:#333333;">A única diferença desta classe para qualquer outra é que ela tem o atributo Serializable. Aliás, na dúvida de saber se suas classes serão serializadas ou não no futuro, aplique este atributo.<br />
Agora vamos criar a classe Program, a qual irá executar o console:</span></p>
<p><span style="color:#333333;">using System;<br />
using System.Collections.Generic;<br />
using System.Text;<br />
using System.IO;<br />
using System.Runtime.Serialization;<br />
using System.Runtime.Serialization.Formatters.Soap;</span></p>
<p><span style="color:#333333;">namespace Serializa_Funcionario<br />
{<br />
class Program<br />
{<br />
static void Main(string[] args)<br />
{<br />
if (args.Length == 0)<br />
{<br />
// Se nao houver nenhum parâmetro, desserializa o arquivo existente.<br />
Funcionario func = Deserialize();<br />
Console.WriteLine(func.ToString());<br />
}<br />
else<br />
{<br />
try<br />
{<br />
if (args.Length != 3)<br />
{<br />
throw new ArgumentException(&#8220;Precisa entrar com três parâmetros.&#8221;);<br />
}</span></p>
<p><span style="color:#333333;">DateTime data = new DateTime(Int32.Parse(args[1]), Int32.Parse(args[2]), Int32.Parse(args[3]));<br />
int idade = DateTime.Now.Year &#8211; dataNascimento.Year;<br />
Funcionario func = new Funcionario(args[0], data, idade);<br />
Console.WriteLine(func.ToString());</span></p>
<p><span style="color:#333333;">Serialize(func);<br />
}<br />
catch (Exception ex)<br />
{<br />
DisplayUsageInformation(ex.Message);<br />
}<br />
}<br />
}</span></p>
<p><span style="color:#333333;">private static void DisplayUsageInformation(string message)<br />
{<br />
Console.WriteLine(&#8220;\nERROR:Parâmetros inválidos. &#8221; + message);<br />
Console.WriteLine(&#8220;\nSerializa_Fucionario \&#8221;Nome\&#8221; Year Month Date&#8221;);<br />
Console.WriteLine(&#8220;\nPor Exemplo:\nSerialize_Fucionario \&#8221;Luiz\&#8221; 1922 11 22&#8243;);<br />
Console.WriteLine(&#8220;\nOu, execute o command sem parâmetros para exibir o funcionário anterior.&#8221;);<br />
}</span></p>
<p><span style="color:#333333;">private static void Serialize(Funcionario func)<br />
{<br />
// Crio o arquivo para salvar as informações<br />
FileStream fs = new FileStream(@&#8221;C:/Funcionario.xml&#8221;, FileMode.Create);</span></p>
<p><span style="color:#333333;">// Crio um SoapFormatter<br />
SoapFormatter sp = new SoapFormatter();</span></p>
<p><span style="color:#333333;">// Uso o SoapFormatter para serializar o objeto no arquivo<br />
sp.Serialize(fs, func);</span></p>
<p><span style="color:#333333;">// Fecho o arquivo<br />
fs.Close();</span></p>
<p><span style="color:#333333;">}</span></p>
<p><span style="color:#333333;">private static Funcionario Deserialize()<br />
{<br />
Funcionario dsFunc = new Funcionario();</span></p>
<p><span style="color:#333333;">//Abro o arquivo para ler os dados<br />
FileStream fs = new FileStream(@&#8221;C:/Funcionario.xml&#8221;, FileMode.Open);</span></p>
<p><span style="color:#333333;">// Crio um SoapFormatter<br />
SoapFormatter sp = new SoapFormatter();</span></p>
<p><span style="color:#333333;">// Uso o SoapFormatter para desserializar o objeto<br />
dsFunc = (Funcionario)sp.Deserialize(fs);</span></p>
<p><span style="color:#333333;">// Fecho o arquivo<br />
fs.Close();</span></p>
<p><span style="color:#333333;">return dsFunc;<br />
}<br />
}<br />
}</span></p>
<p><span style="color:#333333;">Aqui, você precisa preencher as propriedades que serão serializadas. Quando abrir o prompt de comando, digite os parâmetros necessários: nome, data e idade. Se nenhum parâmetro for inserido, vai ser desserializado o arquivo, se existir.</span></p>
<p><span style="color:#333333;">O método Serialize recebe o objeto Funcionario para serializar as propriedades:</span></p>
<p><span style="color:#333333;">private static void Serialize(Funcionario func)<br />
{<br />
// Crio o arquivo onde serão salvas as informações:<br />
FileStream fs = new FileStream(@&#8221;C:/Funcionario.xml&#8221;, FileMode.Create);</span></p>
<p><span style="color:#333333;">// Crio um objeto SOAPFormatter<br />
SoapFormatter sp = new SoapFormatter();</span></p>
<p><span style="color:#333333;">// Uso o SOAPFormatter para serializar as informações no arquivo, passando o stream e a classe.<br />
sp.Serialize(fs, func);</span></p>
<p><span style="color:#333333;">// Fecho o arquivo<br />
fs.Close();</span></p>
<p><span style="color:#333333;">}</span></p>
<p><span style="color:#333333;">O processo inverso é a desserialização. É quando a aplicação remota vai ler as propriedades do seu objeto no arquivo.<br />
Observe que você deve sempre usar o mesmo formato que serializou para desserializar:</span></p>
<p><span style="color:#333333;">private static Funcionario Deserialize()<br />
{<br />
Funcionario dsFunc = new Funcionario();</span></p>
<p><span style="color:#333333;">// Abre o arquivo<br />
FileStream fs = new FileStream(@&#8221;C:/Funcionario.xml&#8221;, FileMode.Open);</span></p>
<p><span style="color:#333333;">// Cria o SoapFormatter para desserializar<br />
SoapFormatter sp = new SoapFormatter();</span></p>
<p><span style="color:#333333;">// Usa o SoapFormatter para desserializar o arquivo para o objeto.<br />
dsFunc = (Funcionario)sp.Deserialize(fs);</span></p>
<p><span style="color:#333333;">// Fecha o arquivo<br />
fs.Close();</span></p>
<p><span style="color:#333333;">return dsFunc;<br />
}</span></p>
<p><span style="color:#333333;">Alguns detalhes sobre Serialização:</span></p>
<p><span style="color:#333333;">* O SOAPFormatter não dá suporte para compatibilidade entre versões. Se você tem uma aplicação na versão 1.0, não conseguirá desserializar na versão 2.0.<br />
* O formato BinaryFormatter tem total suporte a versões diferentes.<br />
* Use SOAPFormatter se você precisar de portabilidade e BinaryFormatter para ter mais eficiência.</span></p>
<p><span style="color:#333333;">Em breve irei postar mais sobre serialização, é um assunto que gosto e muito amplo. Deixo uma questão para você:</span></p>
<p><span style="color:#333333;">Se o SOAPFormatter não dá suporte para compatibilidade entre versões, o que fazer quando precisar mudar a versão da aplicação? Vamos escrever toda a serialização de novo?</span></p>
<p><span style="color:#333333;">Um abraço, até a próxima.<br />
</span></p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/lucianocarvalho.wordpress.com/3/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/lucianocarvalho.wordpress.com/3/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/lucianocarvalho.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/lucianocarvalho.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/lucianocarvalho.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/lucianocarvalho.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/lucianocarvalho.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/lucianocarvalho.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/lucianocarvalho.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/lucianocarvalho.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/lucianocarvalho.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/lucianocarvalho.wordpress.com/3/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lucianocarvalho.wordpress.com&blog=3800458&post=3&subd=lucianocarvalho&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://lucianocarvalho.wordpress.com/2008/05/23/serializando-objetos-com-soap-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/407bcd7a2b8f11259fed715ee5f6aca8?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Luciano Carvalho</media:title>
		</media:content>
	</item>
	</channel>
</rss>