{"id":844,"date":"2010-11-03T00:13:16","date_gmt":"2010-11-03T03:13:16","guid":{"rendered":"https:\/\/devkico.itexto.com.br\/?p=844"},"modified":"2010-11-03T08:12:39","modified_gmt":"2010-11-03T11:12:39","slug":"java-como-a-serializacao-de-objetos-pode-aumentar-e-muito-a-performance-dos-seus-sistemas","status":"publish","type":"post","link":"https:\/\/devkico.itexto.com.br\/?p=844","title":{"rendered":"Java: como a serializa\u00e7\u00e3o de objetos pode salvar sua aplica\u00e7\u00e3o desktop"},"content":{"rendered":"<p><a href=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/11\/duke_fast.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-845 alignleft\" title=\"duke_fast\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/11\/duke_fast-300x300.png\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/11\/duke_fast-300x300.png 300w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/11\/duke_fast-150x150.png 150w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/11\/duke_fast.png 512w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a>Em um dos meus clientes \u00e9 muito comum o desenvolvimento de aplica\u00e7\u00f5es Java voltadas para o ambiente desktop, aonde n\u00e3o raro enfrento problemas s\u00e9rios de performance e consumo de recursos. O objetivo deste post \u00e9 expor como usando o recurso de serializa\u00e7\u00e3o de objetos oferecido pela plataforma Java consegui resolver (ou ao menos minimizar ao extremo) este desafio.<\/p>\n<p>Imagine a seguinte situa\u00e7\u00e3o: sua aplica\u00e7\u00e3o desktop acessa informa\u00e7\u00f5es presentes em um banco de dados relacional. Dado que voc\u00ea precisa de produtividade, opta por usar uma ferramenta ORM como Hibernate ou JPA. N\u00e3o resta d\u00favidas de que trata-se de um recurso maravilhoso, mas infelizmente traz consigo um custo de mem\u00f3ria (precisamos carregar o motor de mapeamento objeto relacional, al\u00e9m disto, muitas vezes usamos cacheamento que, ao menos em parte, fica em mem\u00f3ria) e performance (trata-se de mais uma camada no sistema). Em algumas situa\u00e7\u00f5es causa um aumento no tempo de carregamento dos nossos sistemas t\u00e3o grande que, n\u00e3o raro, voc\u00ea se v\u00ea questionando o ganho real do seu uso.<\/p>\n<p>Imagine agora outra situa\u00e7\u00e3o: sua aplica\u00e7\u00e3o trabalha apenas com JDBC e, com isto, sua performance \u00e9 superior \u00e0 obtida usando JPA ou Hibernate (apesar de sua exist\u00eancia neste caso ser mais infeliz), por\u00e9m h\u00e1 limita\u00e7\u00f5es no n\u00famero de conex\u00f5es que podem ser feitas ao SGBD e, pior ainda, o tempo gasto estabelecendo a conex\u00e3o com o SGBD \u00e9 alto. Em situa\u00e7\u00f5es como esta, o tal &#8220;ganho de performance&#8221; por n\u00e3o se estar usando Hibernate se perde totalmente, pois voc\u00ea nem tem o cacheamento autom\u00e1tico provido pelo ORM.<\/p>\n<p>Em ambos os casos, como resolver o problema? Simples: <strong>evitando ao m\u00e1ximo que seja necess\u00e1rio estabelecer QUALQUER tipo de conex\u00e3o com o servidor<\/strong>.<\/p>\n<h2>Entra em cena a serializa\u00e7\u00e3o de objetos<\/h2>\n<p>Todo sistema possui informa\u00e7\u00f5es cuja altera\u00e7\u00e3o seja rara, ou seja, registros que apenas s\u00e3o inseridos no banco de dados e em raras situa\u00e7\u00f5es tenham seus dados alterados. Como exemplos posso citar um cadastro de fornecedores ou endere\u00e7os. Tratam-se de informa\u00e7\u00f5es que s\u00e3o usadas, em 90% dos casos, apenas para consulta ou na composi\u00e7\u00e3o de tipos mais complexos. Pergunte-se:<strong> \u00e9 realmente necess\u00e1rio sempre pedir ao SGBD estes dados?<\/strong><\/p>\n<p>Nestes casos, a serializa\u00e7\u00e3o de objetos cai como uma luva. E se voc\u00ea est\u00e1 em um ambiente corporativo, \u00e9 poss\u00edvel inclusive fazer com que um \u00fanico usu\u00e1rio beneficie todos os demais com um custo adicional m\u00ednimo. Vou ilustrar a situa\u00e7\u00e3o usando como exemplo uma aplica\u00e7\u00e3o desktop que precise expor em um formul\u00e1rio uma caixa de sele\u00e7\u00e3o contendo a listagem de fornecedores presentes no banco de dados.<\/p>\n<p>Vamos supor que esta nossa aplica\u00e7\u00e3o use o Hibernate. Neste caso, ao criar uma nova inst\u00e2ncia do formul\u00e1rio, precisamos obter a listagem de fornecedores seguindo o seguinte procedimento:<\/p>\n<ol>\n<li>\u00c9 criada uma consulta no Hibernate usando criteria ou HQL<\/li>\n<li>Esta consulta \u00e9 transformada em comandos SQL que ser\u00e3o enviados ao driver JDBC<\/li>\n<li>O driver JDBC envia a consulta para o SGBD<\/li>\n<li>O SGBD executa a consulta e retorna o resultado para o cliente<\/li>\n<li>O driver JDBC traduz o resultado enviado pelo SGBD para um objeto java.sql.Recordset<\/li>\n<li>O Hibernate cria novas inst\u00e2ncias da classe Fornecedor e, via reflex\u00e3o, preenche todos os seus atributos<\/li>\n<li>E, finalmente, \u00e9 retornada uma lista contendo o resultado para o cliente<\/li>\n<\/ol>\n<p>Se esta for a primeira consulta feita pela aplica\u00e7\u00e3o, o seu usu\u00e1rio ainda vai ter de sofrer um pouquinho com o carregamento do SessionFactory do Hibernate.<\/p>\n<p>Agora, quer ver como as coisas ficam mais simples usando serializa\u00e7\u00e3o? Suponha que eu j\u00e1 tenha serializado esta lista de fornecedores em um arquivo presente em minha rede. O seguinte procedimento seria adotado.<\/p>\n<ol>\n<li>\u00c9 verificado se o arquivo existe na rede.<\/li>\n<li>Se o arquivo existe, ent\u00e3o este \u00e9 desserializado em uma lista de fornecedores e retornado ao cliente.<\/li>\n<li>Se o arquivo n\u00e3o existe, execute o longo procedimento exposto acima novamente, com a diferen\u00e7a de que, agora, voc\u00ea serializar\u00e1 o resultado em arquivo no final.<\/li>\n<\/ol>\n<p>Observe que interessante: n\u00e3o precisei carregar o Hibernate nem comunicar-me com qualquer servidor. Claro, se o arquivo n\u00e3o existisse, todo o processo citado acima seria necess\u00e1rio, por\u00e9m em um ambiente de rede, s\u00f3 precisaria ser feito uma vez pelo primeiro usu\u00e1rio que necessitasse da lista de fornecedores. Dai pra frente, todos os demais usu\u00e1rios obteriam o ganho de performance que apresentei.<\/p>\n<h2>Mas o que \u00e9 serializa\u00e7\u00e3o de objetos<\/h2>\n<p>Ok, talvez voc\u00ea esteja apenas come\u00e7ando a aprender Java e n\u00e3o saiba o que \u00e9 esta tal de serializa\u00e7\u00e3o. Porcamente falando, serializa\u00e7\u00e3o \u00e9 o processo de salvar em arquivo um objeto presente na mem\u00f3ria do seu computador.<\/p>\n<p>Se eu quisesse salvar a minha listagem de fornecedores em um arquivo, o c\u00f3digo abaixo daria conta do recado:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n\r\njava.io.ObjectOutputStream oos = new java.io.ObjectOutputStream(new FileOutputStream(new File(&quot;fornecedores&quot;)));\r\n\r\noos.writeObject(listaFornecedores);\r\n\r\noos.close();\r\n\r\n<\/pre>\n<p>E, para transformar o meu arquivo em objeto, de novo apenas tr\u00eas linhas fariam o trabalho pra mim.<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n\r\njava.io.ObjectInputStream ois = new java.io.ObjectInputStream(new FileInputStream(new File(&quot;fornecedores&quot;)));\r\n\r\nList&lt;Fornecedor&gt; lista = (List&lt;Fornecedor&gt;) ois.readObject();\r\n\r\nois.close();\r\n\r\n<\/pre>\n<p>Detalhe: s\u00f3 podem ser serializados objetos que implementem a interface java.io.Serializable.<\/p>\n<p>Omiti as excess\u00f5es apenas para expor como \u00e9 um recurso absurdamente f\u00e1cil de ser usado.<\/p>\n<h2>Armadilhas a serem evitadas<\/h2>\n<p>O principal desafio desta abordagem \u00e9 manter o cache sempre atualizado. Tenho duas solu\u00e7\u00f5es para este problema. A mais simples \u00e9 de tempos em tempos apagar os arquivos de cache da rede. A mais complexa consiste em, toda vez que for persistir uma novo registro no banco de dados, apagar os arquivos de cache.<\/p>\n<p>Dica: evite ao m\u00e1ximo chamar a fun\u00e7\u00e3o exist() da classe java.io.File, pois esta \u00e9 absurdamente cara, visto que a cada chamada acessa o gerenciador de seguran\u00e7a do Java. Dado que o objetivo de qualquer sistema \u00e9 expor os dados para o usu\u00e1rio, voc\u00ea pode sempre, ao verificar a exist\u00eancia do cache, escrever c\u00f3digo similar ao exposto abaixo:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n\r\nprivate List&lt;Fornecedor&gt; getListaCache() {\r\n\r\ntry {\r\n\r\nObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File(&quot;fornecedores&quot;)));\r\n\r\nList&lt;Fornecedor&gt; resultado = (List&lt;Fornecedor&gt;) ois.readObject();\r\n\r\nois.close();\r\n\r\nreturn resultado;\r\n\r\n} catch (Throwable t) {\r\n\r\nreturn null;\r\n\r\n}\r\n\r\n}\r\n\r\npublic List&lt;Fornecedor&gt; getFornecedores() {\r\n\r\nList&lt;Fornecedor&gt; no_cache = getListaCache();\r\n\r\nif (no_cache != null) return no_cache;\r\n\r\n\/\/ caso contr\u00e1rio, procedimento padr\u00e3o, serializando o resultado no final\r\n\r\n}\r\n\r\n<\/pre>\n<p>Outra armadilha: em um ambiente de rede, evite serializar os dados no HD local do usu\u00e1rio. Sempre que poss\u00edvel, opte por usar um drive de rede. Assim, caso seja necess\u00e1rio uma atualiza\u00e7\u00e3o do cache imediata, voc\u00ea, como administrador do sistema, em \u00faltimo caso sempre poder\u00e1 apagar o arquivo de cache, for\u00e7ando o cliente a recri\u00e1-lo novamente.<\/p>\n<p>Fique atento tamb\u00e9m ao que ser\u00e1 serializado. Dados que apenas ocasionalmente s\u00e3o consultados n\u00e3o s\u00e3o um bom alvo. Opte apenas por aquelas informa\u00e7\u00f5es que s\u00e3o vitais ao uso do seu sistema e cuja atualiza\u00e7\u00e3o seja rara.<\/p>\n<p><strong>E, a principal armadilha: <span style=\"color: #ff0000;\">JAMAIS<\/span> use esta t\u00e9cnica em entidades que precisem ser constantemente atualizadas na base de dados.<\/strong><\/p>\n<h2>Padr\u00e3o: buscando um \u00fanico registro<\/h2>\n<p>H\u00e1 situa\u00e7\u00f5es em que n\u00e3o \u00e9 necess\u00e1rio buscar uma lista de registros, mas apenas um, o que normalmente \u00e9 feito executando uma consulta por chave prim\u00e1ria. Nestes casos, adotei um padr\u00e3o bastante simples. Crio um diret\u00f3rio na rede chamado cache e, dentro dele, um subdiret\u00f3rio que identifique o tipo da minha entidade. No caso de fornecedores, chamo este diret\u00f3rio, por exemplo, de <em>\/cache\/fornecedor<\/em>. No interior deste diret\u00f3rio armazeno arquivos cujo nome corresponda \u00e0 chave prim\u00e1ria da entidade que desejo buscar no banco de dados.<\/p>\n<h2>Mas se o Hibernate j\u00e1 possui sistema de cache, pra que usar serializa\u00e7\u00e3o?<\/h2>\n<p><a href=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/11\/hibernate.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-medium wp-image-848\" title=\"hibernate\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/11\/hibernate-300x83.png\" alt=\"\" width=\"300\" height=\"83\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/11\/hibernate-300x83.png 300w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/11\/hibernate-1024x284.png 1024w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a>Como diriam os candidatos a presidente em um debate&#8230; esta \u00e9 uma pergunta important\u00edssima.<\/p>\n<p>Simples: porque a serializa\u00e7\u00e3o, tal como estou expondo neste post, deve ser usada ANTES da primeira chamada ao Hibernate, pois assim, em algumas situa\u00e7\u00f5es, consegue-se evitar o carregamento deste framework e, consequentemente, nosso usu\u00e1rio final ter\u00e1 um sistema muito mais leve e respons\u00edvel.<\/p>\n<p><strong>Se sua aplica\u00e7\u00e3o vai ser executada em um servidor nem sei se o uso desta t\u00e9cnica trar\u00e1 algum resultado que realmente valha \u00e0 pena.<\/strong><\/p>\n<h2>Conclus\u00f5es<\/h2>\n<p>Uso esta t\u00e9cnica para resolver os problemas de performance que enfrento em aplica\u00e7\u00f5es desktop, aonde normalmente os recursos computacionais podem ser mais limitados (as malditas &#8220;m\u00e1quinas brancas&#8221;). O que pude observar \u00e9 que, nestes casos, obtenho ganhos de performance astron\u00f4micos, pois a comunica\u00e7\u00e3o com o SGBD \u00e9 reduzida a apenas o estritamente necess\u00e1rio.<\/p>\n<p>Outro ganho que obtenho \u00e9 o tempo de inicializa\u00e7\u00e3o da aplica\u00e7\u00e3o, pois \u00e9 muito comum neste momento ser necess\u00e1ria a execu\u00e7\u00e3o de alguma consulta no SGBD. Sendo assim, esta \u00e9 uma t\u00e9cnica que, ao menos por enquanto, cai como uma luva quando aplicada ao ambiente desktop.<\/p>\n<p>Aos que queiram se aprofundar mais no assunto, sugiro a leitura deste post: &#8220;The Java serialization algorithm revealed&#8221;, que explica com detalhes o processo de serializa\u00e7\u00e3o: <a href=\"http:\/\/www.javaworld.com\/community\/node\/2915\" target=\"_blank\">http:\/\/www.javaworld.com\/community\/node\/2915<\/a><\/p>\n<p>Agora: sabem o que me choca nesta hist\u00f3ria toda? Este recurso maravilhoso oferecido pela plataforma \u00e9 rar\u00edssimas vezes usado pelos desenvolvedores. Da pra acreditar???<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Em um dos meus clientes \u00e9 muito comum o desenvolvimento de aplica\u00e7\u00f5es Java voltadas para o ambiente desktop, aonde n\u00e3o raro enfrento problemas s\u00e9rios de performance e consumo de recursos. O objetivo deste post \u00e9 expor como usando o recurso de serializa\u00e7\u00e3o de objetos oferecido pela plataforma Java consegui resolver (ou ao menos minimizar ao [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[36,7,6,24,37],"tags":[],"class_list":["post-844","post","type-post","status-publish","format-standard","hentry","category-desenvolvimento-de-software","category-hibernate","category-java","category-jdbc","category-swing"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Java: como a serializa\u00e7\u00e3o de objetos pode salvar sua aplica\u00e7\u00e3o desktop - \/dev\/Kico<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/devkico.itexto.com.br\/?p=844\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Java: como a serializa\u00e7\u00e3o de objetos pode salvar sua aplica\u00e7\u00e3o desktop - \/dev\/Kico\" \/>\n<meta property=\"og:description\" content=\"Em um dos meus clientes \u00e9 muito comum o desenvolvimento de aplica\u00e7\u00f5es Java voltadas para o ambiente desktop, aonde n\u00e3o raro enfrento problemas s\u00e9rios de performance e consumo de recursos. O objetivo deste post \u00e9 expor como usando o recurso de serializa\u00e7\u00e3o de objetos oferecido pela plataforma Java consegui resolver (ou ao menos minimizar ao [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/devkico.itexto.com.br\/?p=844\" \/>\n<meta property=\"og:site_name\" content=\"\/dev\/Kico\" \/>\n<meta property=\"article:published_time\" content=\"2010-11-03T03:13:16+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2010-11-03T11:12:39+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.itexto.net\/devkico\/wp-content\/uploads\/2010\/11\/duke_fast-300x300.png\" \/>\n<meta name=\"author\" content=\"Kico (Henrique Lobo Weissmann)\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@loboweissmann\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Kico (Henrique Lobo Weissmann)\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=844\",\"url\":\"https:\/\/devkico.itexto.com.br\/?p=844\",\"name\":\"Java: como a serializa\u00e7\u00e3o de objetos pode salvar sua aplica\u00e7\u00e3o desktop - \/dev\/Kico\",\"isPartOf\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=844#primaryimage\"},\"image\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=844#primaryimage\"},\"thumbnailUrl\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/11\/duke_fast-300x300.png\",\"datePublished\":\"2010-11-03T03:13:16+00:00\",\"dateModified\":\"2010-11-03T11:12:39+00:00\",\"author\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7\"},\"breadcrumb\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=844#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/devkico.itexto.com.br\/?p=844\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=844#primaryimage\",\"url\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/11\/duke_fast.png\",\"contentUrl\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/11\/duke_fast.png\",\"width\":\"512\",\"height\":\"512\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=844#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/devkico.itexto.com.br\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java: como a serializa\u00e7\u00e3o de objetos pode salvar sua aplica\u00e7\u00e3o desktop\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#website\",\"url\":\"https:\/\/devkico.itexto.com.br\/\",\"name\":\"\/dev\/Kico\",\"description\":\"Desenvolvendo software\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/devkico.itexto.com.br\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7\",\"name\":\"Kico (Henrique Lobo Weissmann)\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g\",\"caption\":\"Kico (Henrique Lobo Weissmann)\"},\"sameAs\":[\"https:\/\/x.com\/loboweissmann\"],\"url\":\"https:\/\/devkico.itexto.com.br\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Java: como a serializa\u00e7\u00e3o de objetos pode salvar sua aplica\u00e7\u00e3o desktop - \/dev\/Kico","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/devkico.itexto.com.br\/?p=844","og_locale":"pt_BR","og_type":"article","og_title":"Java: como a serializa\u00e7\u00e3o de objetos pode salvar sua aplica\u00e7\u00e3o desktop - \/dev\/Kico","og_description":"Em um dos meus clientes \u00e9 muito comum o desenvolvimento de aplica\u00e7\u00f5es Java voltadas para o ambiente desktop, aonde n\u00e3o raro enfrento problemas s\u00e9rios de performance e consumo de recursos. O objetivo deste post \u00e9 expor como usando o recurso de serializa\u00e7\u00e3o de objetos oferecido pela plataforma Java consegui resolver (ou ao menos minimizar ao [&hellip;]","og_url":"https:\/\/devkico.itexto.com.br\/?p=844","og_site_name":"\/dev\/Kico","article_published_time":"2010-11-03T03:13:16+00:00","article_modified_time":"2010-11-03T11:12:39+00:00","og_image":[{"url":"http:\/\/www.itexto.net\/devkico\/wp-content\/uploads\/2010\/11\/duke_fast-300x300.png"}],"author":"Kico (Henrique Lobo Weissmann)","twitter_card":"summary_large_image","twitter_creator":"@loboweissmann","twitter_misc":{"Escrito por":"Kico (Henrique Lobo Weissmann)","Est. tempo de leitura":"8 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/devkico.itexto.com.br\/?p=844","url":"https:\/\/devkico.itexto.com.br\/?p=844","name":"Java: como a serializa\u00e7\u00e3o de objetos pode salvar sua aplica\u00e7\u00e3o desktop - \/dev\/Kico","isPartOf":{"@id":"https:\/\/devkico.itexto.com.br\/#website"},"primaryImageOfPage":{"@id":"https:\/\/devkico.itexto.com.br\/?p=844#primaryimage"},"image":{"@id":"https:\/\/devkico.itexto.com.br\/?p=844#primaryimage"},"thumbnailUrl":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/11\/duke_fast-300x300.png","datePublished":"2010-11-03T03:13:16+00:00","dateModified":"2010-11-03T11:12:39+00:00","author":{"@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7"},"breadcrumb":{"@id":"https:\/\/devkico.itexto.com.br\/?p=844#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/devkico.itexto.com.br\/?p=844"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/devkico.itexto.com.br\/?p=844#primaryimage","url":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/11\/duke_fast.png","contentUrl":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/11\/duke_fast.png","width":"512","height":"512"},{"@type":"BreadcrumbList","@id":"https:\/\/devkico.itexto.com.br\/?p=844#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/devkico.itexto.com.br\/"},{"@type":"ListItem","position":2,"name":"Java: como a serializa\u00e7\u00e3o de objetos pode salvar sua aplica\u00e7\u00e3o desktop"}]},{"@type":"WebSite","@id":"https:\/\/devkico.itexto.com.br\/#website","url":"https:\/\/devkico.itexto.com.br\/","name":"\/dev\/Kico","description":"Desenvolvendo software","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/devkico.itexto.com.br\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"pt-BR"},{"@type":"Person","@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7","name":"Kico (Henrique Lobo Weissmann)","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g","caption":"Kico (Henrique Lobo Weissmann)"},"sameAs":["https:\/\/x.com\/loboweissmann"],"url":"https:\/\/devkico.itexto.com.br\/?author=1"}]}},"jetpack_featured_media_url":"","jetpack-related-posts":[],"jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/844"}],"collection":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=844"}],"version-history":[{"count":5,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/844\/revisions"}],"predecessor-version":[{"id":851,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/844\/revisions\/851"}],"wp:attachment":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=844"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=844"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=844"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}