Serialização – Solução Para Persistência de Objetos

11
Desenvolvimento Java Serialização – Solução Para Persistência de Objetos Neste artigo apresento o Gustavo Rafael Valiati, que pode ser contatado pelo email [email protected]. O Gustavo foi meu aluno em algumas disciplinas de sua gradução e está concluíndo o último período do curso de Tecnologia em Análise e Desenvolvimento de Sistemas da UTFPR campus Medianeira, neste primeiro semestre de 2012. por Everton Coimbra de Araújo Neste artigo apresento o Gustavo Rafael Valiati, que pode ser contatado pelo email [email protected]. O Gustavo foi meu aluno em algumas disciplinas de sua gradução e está concluíndo o último período do curso de Tecnologia em Análise e Desenvolvimento de Sistemas da UTFPR campus Medianeira, neste primeiro semestre de 2012. 1. INTRODUÇÃO Nem sempre se deseja ter objetos ou estrutura de dados de um aplicativo, com um ciclo de vida que dura no máximo o tempo em que for armazenado em memória RAM. Ou seja, algumas vezes desejase guardálos por um tempo indeterminado, sendo possível recuperálos posteriormente. E neste caso, o termo “persistência” tem seu conceito definido. Persistir dados, requer que estes possam ser serializáveis. A serialização possibilitará capturar o estado do objeto ou a estrutura de dados, e transformar emuma cadeia de bytes quando for necessário. Tornase possível também, recuperar os bytes persistidos para fazer o processo inverso, e ter os dados de volta para a aplicação em execução. Desta maneira, qualquer forma de dados que esteja sendo trabalhada na aplicação, e esta puder ser serializada, poderá ser passada para o meio físico, e ter o processo revertido. A serialização não se limita apenas em possibilitar a gravação do dado em disco, mas permite que o Pesquisar 0 72 3 0 4

description

ADS

Transcript of Serialização – Solução Para Persistência de Objetos

08/07/2015 SerializaoSoluoParaPersistnciadeObjetoshttp://www.linhadecodigo.com.br/artigo/3401/serializacaosolucaoparapersistenciadeobjetos.aspx 1/11DesenvolvimentoJavaSerializaoSoluoParaPersistnciadeObjetosNesteartigoapresentooGustavoRafaelValiati,quepodesercontatadopeloemailgustavovaliati@gmail.com.OGustavofoimeualunoemalgumasdisciplinasdesuagraduoeestconclundooltimoperododocursodeTecnologiaemAnliseeDesenvolvimentodeSistemasdaUTFPRcampusMedianeira,nesteprimeirosemestrede2012.porEvertonCoimbradeArajoNesteartigoapresentooGustavoRafaelValiati,quepodesercontatadopeloemailgustavovaliati@gmail.com.OGustavofoimeualunoemalgumasdisciplinasdesuagraduoeestconclundooltimoperododocursodeTecnologiaemAnliseeDesenvolvimentodeSistemasdaUTFPRcampusMedianeira,nesteprimeirosemestrede2012.1.INTRODUONemsempresedesejaterobjetosouestruturadedadosdeumaplicativo,comumciclodevidaqueduranomximootempoemqueforarmazenadoemmemriaRAM.Ouseja,algumasvezesdesejaseguardlosporumtempoindeterminado,sendopossvelrecuperlosposteriormente.Enestecaso,otermopersistnciatemseuconceitodefinido.Persistirdados,requerqueestespossamserserializveis.Aserializaopossibilitarcapturaroestadodoobjetoouaestruturadedados,etransformaremumacadeiadebytesquandofornecessrio.Tornasepossveltambm,recuperarosbytespersistidosparafazeroprocessoinverso,eterosdadosdevoltaparaaaplicaoemexecuo.Destamaneira,qualquerformadedadosqueestejasendotrabalhadanaaplicao,eestapuderserserializada,poderserpassadaparaomeiofsico,eteroprocessorevertido.Aserializaonoselimitaapenasempossibilitaragravaododadoemdisco,maspermitequeoPesquisar0 72 3 0 408/07/2015 SerializaoSoluoParaPersistnciadeObjetoshttp://www.linhadecodigo.com.br/artigo/3401/serializacaosolucaoparapersistenciadeobjetos.aspx 2/11mesmosejatransmitidoporrede.Istoporquaserializaocriaumstreamdebytes,querequisitoparatransmissodedadosporrede.Diversaslinguagenspossuemsuporteserializao,como:Java,C,C++,Python,PHP,.NET,entreoutras.Nesteartigo,sertratadoapenasdaserializaocomJava,emsuaimplemetaobsica,algunsproblemasesolues,comcdigosparaexemplificao.2.SERIALIZAOCOMJAVASerializarumobjeto,emJava,spossvelcasosuaclasseestejamarcadacomoserializvel.Essamarcaofeitacomasimplesimplementaodainterfacejava.io.Serializable.Essainterfacenopossuimtodosparaseimplementarenematributos.AindanoexistiamasanotaesnoJava1.1,versoquetrouxepelaprimeiravezaserializaoaoJava,edestamaneiraaimplementaodainterfaceeraamelhormaneirademarcarumaclasse.Aheranaentreclassesnaturalmenteafetadapelaserializao.JquequandoumaclasseimplementaainterfaceSerializable,todaclassequedelaestendertambmestarimplicitamentemarcadacomoserializvel.Paraexemplo,sercriadaumaclassepojo.Frutaquecontmdoisatributos:nomeecor.Nocdigoexemplo(Listagem1),podesenotaraclasseFrutamarcadaparaaserializao:Listagem1Marcandoumaclassecomoserializvel.Podesedizerqueaimplementaodoprocessodeserializaoedeserializaosimplesdeumobjeto,nopossuiumcdigodifcildeseescrever.Istoporquduasclassesfazemamaiorpartedotrabalho,demaneiraquecompoucaslinhasdecdigopodesetransformarumobjetoembyteseviceversa.Essasduasclassessojava.io.ObjectInputStreamquerecebebytesparacriarumobjetoejava.io.ObjectOutputStreamquecriaumacadeiadebytesapartirdeumobjeto.3.SERIALIZANDOEDESERIALIZANDOOESTADODEUMOBJETOComoexemplo,serpersistidoumobjetoemdisco.Paraisto,almdasclasses12345678910111213141516importjava.io.Serializable;publicclassFrutaimplementsSerializable{privateStringnome;privateStringcor;publicFruta(Stringnome,Stringcor){this.nome=nome;this.cor=cor;}publicStringgetCor(){returncor;}publicStringgetNome(){returnnome;}publicvoidsetCor(Stringcor){this.cor=cor;}publicvoidsetNome(Stringnome){this.nome=nome;}}08/07/2015 SerializaoSoluoParaPersistnciadeObjetoshttp://www.linhadecodigo.com.br/artigo/3401/serializacaosolucaoparapersistenciadeobjetos.aspx 3/11java.io.ObjectInputStreamejava.io.ObjectOutputStream,seroutilizadasduasoutrasquetrabalhamcomarquivos,quesojava.io.FileInputStreamejava.io.FileOutputStream,queseguemamesmalgicadeInputStreameOutputStream,squeagorarelacionadoaosistemadearquivosenoaosobjetos.Paraserializao,devesecriarumnovojava.io.FileOutputStream,comocaminho(path)doarquivoondesedesejaarmazenaroestadodoobjeto.Tambmdevesercriadoumnovojava.io.ObjectOutputStreamqueestligadoaoarquivo.Eporltimodeveseexecutaraescritadoobjetoalvo,paradentrodoobjetodestreamqueporsuavezestligadoaoarquivodestino.Apsexecutadosessespassos,possvelencontrarnosistemadearquivosumnovoarquivoquecontmosbytescorrespondentesdescriodoestadodoobjeto.NaListagem2,encontraseocdigoexemplo.Listagem2Serializaodeumobjeto.Eparaadeserializao,oprocessoextremamenteparecidocomaserializao.Criaseumnovojava.io.FileInputStreamrelacionadoaoarquivoondeoestadodoobjetoencontrasepersistido.Devesecriartambmumnovojava.io.ObjectInputStreamqueestarvinculadoaoarquivodeorigem.Porltimo,executasealeituradoarquivoparaarestauraodoestado.NaListagem3encontraseoexemplodocdigo.Listagem3Deserializaodeumobjeto.1234567891011121314importjava.io.FileOutputStream;importjava.io.ObjectOutputStream;publicclassSerializador{publicSerializador(){}publicvoidserializar(Stringpath,Objectobj)throwsException{FileOutputStreamoutFile=newFileOutputStream(path);ObjectOutputStreams=newObjectOutputStream(outFile);s.writeObject(obj);s.close();}}123456789101112131415importjava.io.FileInputStream;importjava.io.ObjectInputStream;publicclassDeserializador{publicDeserializador(){}publicObjectdeserializar(Stringpath)throwsException{FileInputStreaminFile=newFileInputStream(path);ObjectInputStreamd=newObjectInputStream(inFile);Objecto=d.readObject();d.close();returno;}}08/07/2015 SerializaoSoluoParaPersistnciadeObjetoshttp://www.linhadecodigo.com.br/artigo/3401/serializacaosolucaoparapersistenciadeobjetos.aspx 4/11AListagem4,contmoexemplodaexecuodaserializaoeemseguidadadeserializao.Listagem4SerializandoeDeserializandoNaListagem5,encontraseumexemplodeserializaoedeserializaodeumArrayListdaclasseFruta.apenasmaisumexemploquedemonstraacapacidadedesepersistirqualquerobjetoquesejaserializvel.EssaserializaosfoipossvelporqueaclasseArrayListimplementaainterfaceSerializableporpadro.Listagem5SerializaodeArrayList.1234567891011121314151617181920212223242526importoperacoes.Deserializador;importoperacoes.Serializador;importpojo.Fruta;publicclassPrincipal{publicstaticvoidmain(Stringargs[]){//serializaSerializadors=newSerializador();Frutafruta=newFruta("Maa","Vermelha");try{s.serializar("/home/gustavo/fruta",fruta);}catch(Exceptionex){System.err.println("Falhaaoserializar!"+ex.toString());}//deserializaDeserializadord=newDeserializador();fruta=null;try{fruta=(Fruta)d.deserializar("/home/gustavo/fruta");}catch(Exceptionex){System.err.println("Falhaaodeserializar!"+ex.toString());}System.out.println(fruta.getNome()+""+fruta.getCor());}}1234567891011121314151617181920//serializaoedeserializaocomArrayListArrayListfrutas=newArrayList();Frutaf1=newFruta("Laranja","Amarela");Frutaf2=newFruta("Abacate","Verde");Frutaf3=newFruta("Morango","Vermelho");frutas.add(f1);frutas.add(f2);frutas.add(f3);try{s.serializar("/home/gustavo/frutas",frutas);frutas=null;frutas=(ArrayList)d.deserializar("/home/gustavo/frutas");for(Frutaf:frutas){System.out.println("ArrayList:"+f.getNome()+""+f.getCor());}}catch(Exceptionex){System.err.println("Falhaaoserializaroudeserializar!"+ex.toString());}08/07/2015 SerializaoSoluoParaPersistnciadeObjetoshttp://www.linhadecodigo.com.br/artigo/3401/serializacaosolucaoparapersistenciadeobjetos.aspx 5/114.PARTICULARIDADESDASERIALIZAOComodito,aserializaodeumobjetoemJavapodeseralgofcildesefazer.Masexistemcertasinformaesquesoimportantesesablaspodeevitarvriosproblemas.Umdosproblemasquenemtudopodeserserializado,comoobjetosdasclassesThreadeSocketeatributosestticos.Osatributosestticosestovinculadosclasseenoaoobjeto.Assimquandosetratadoestadodoobjeto,oscamposestticosnosoconsiderados.EmrelaosThreads,suasinstnciasssoteisenquantoestiverememexecuonaJVM,epodemserparadas/destrudaseiniciadascominstruesdesuaclasse.Noexistealgonoestadodestasinstnciasquesejatilparasepersistir,eporissonohsentidoempersistirtaisinstnciaspararestaurarposteriormente.Maseseexistiralgumaclasseemquesejanecessriopersistila,eestapossuiumainstnciadaclasseThread?Nestecaso,utilizandoumrecursopodesepersistiraclasseinteira,menosainstnciathread.Esterecurso,refereseemindicarquetalinstnciathreadumobjetoTransient.NaListagem6encontraseumexemplodaimplementaocomusodeTransient.Listagem6UsodoTransientValeressaltarque,oqueserializadoapenasoestadodoobjeto,enoosmtodoseaclasse.Noexemploacima,apenasainstnciadoobjetothreadedoobjetovalorParaPersistircompunhamoestadodoobjeto.Assim,evitasequeosistemadeserializaotenteserializarumobjetonoserializvelegereerros.ApsadeserializaodeumobjetodaclasseImplementacaoTransientesteestartotalmentefuncional.Umoutroproblemaquepodeviraocorrer,serefereaoversionamentodasclasses.TodaclassepossuiumatributoocultochamadoserialVersionUIDcomumvalorgeradoautomaticamente.ObjetoscriadoslevamconsigooserialVersionUIDdesuaclasse,queindicasuaverso.Todavezqueumaclassesofrealteraesemseucdigo,umnovoserialVersionUIDgerado.Oproblemacoma1234567891011121314151617181920212223importjava.io.Serializable;publicclassImplementacaoTransientimplementsSerializable,Runnable{transientprivateThreadthread;//marcadocom"transient"paraquesuainstncianosejaserializada//DemaisvaloresdeestadoseroserializadosprivateintvalorParaPersistir;publicImplementacaoTransient(intvalorParaPersistir){this.valorParaPersistir=valorParaPersistir;thread=newThread(this);thread.start();}publicvoidrun(){while(true){//cdigoaserexecutadopelaThread}}}08/07/2015 SerializaoSoluoParaPersistnciadeObjetoshttp://www.linhadecodigo.com.br/artigo/3401/serializacaosolucaoparapersistenciadeobjetos.aspx 6/11serializaosurgequandoserializaseoestadodeumobjetoeposteriormentetentaserestauraroestadoparaaaplicao,mashouverammudanasnocdigodaclasse.Nestecaso,umaexceojava.io.InvalidClassExceptiondisparada,poisdefato,oestadodoobjetocorrespondeaumaversodeclassedoqualfoicriadoquejnoexistemais.Portanto,issosocorreparaevitarerrosdeprogramao,emquetentaserestauraroestadodeumobjetoparaumaclassequepossuiversodiferentedaqualoobjetofoiserializadoinicialmente.EissopodesignificardiferentesversesdeumamesmaclasseFrutaporexemplo,oudiferentesversesporclassesseremtotalmentediferentescomo:oestadodeumobjetodaclasseFrutaserrestauradoparaclasseCarro.Masquandonecessrio,conscientemente,recuperaroestadodeumobjeto,mesmoquehouveramalteraesnaclassedoqualfoigerado,possvelcontrolarmanualmenteoserialVersionUID.Paraisto,bastadeclararexplicitamentenaformadeatributoestticoefinal,umvalorLongqualquerparacorresponderversodaclasse.Eassim,mesmoquehouveremmodificaesnaclasse,aversopermeneceramesma,evitandoasexceesdaincompatiblidadedeclasses.Noentanto,valeressaltarqueoversionamentonoumimpeclioparaoprogramador,massimmuitoimportanteemcasosquedesejasemanterumcontrolesobreacompatibilidadedecdigonaaplicao,definindoversesparaclassesNocdigodaListagem7encontraseoexemplodocontrolemanualdoserialVersionUID.Listagem7UsomanualdoserialVersionUIDOJDKforneceumaferramentaquepermitevisualizaraversodequalquerclasseJava.Bastanoterminaldosistemaoperacionalutilizarocomandoserialverseguidodaclassequalificada,conformeexemplodaListagem8.Listagem8VerificaodaversodeclasseAserializaoacabainflingindoalgunsmodelosdeseguranaemseuprocedimentopadro,ecriandoentoumnovoproblema.Quandoumestadodeobjetopersistidonosistemadearquivosouenviadoporrede,ofluxobinriopodeserdetectado,analisadoeobtidasinformaessobreaclasseeoestadodoobjeto.Porexemplo,seutilizadoumeditordetextoqualquerparaabriroarquivopersistido12345678910111213141516importjava.io.Serializable;publicclassFrutaimplementsSerializable{privateStringnome;privateStringcor;staticfinallongserialVersionUID=123L;//indicaaversaodaclassepublicFruta(Stringnome,Stringcor){this.nome=nome;this.cor=cor;}publicStringgetCor(){returncor;}publicStringgetNome(){returnnome;}publicvoidsetCor(Stringcor){this.cor=cor;}publicvoidsetNome(Stringnome){this.nome=nome;}}1 serialverpojo.FrutaLOGIN08/07/2015 SerializaoSoluoParaPersistnciadeObjetoshttp://www.linhadecodigo.com.br/artigo/3401/serializacaosolucaoparapersistenciadeobjetos.aspx 7/11doestadodoobjetodaclasseFrutadosexemplosanteriores,comumosatributoseoutrasinformaesapareceremcomoumsimplestexto,totalouparcilamentelegveis,assimcomodemonstradonaListagem9.Listagem9Exemplodeleituradearquivobinriodeumestadodeobjetopersistido.Comumaferramentamenossimplesseriapossvelaumentaraquantidadedeinformaeslegveis,coletandoumamaiorquantiadedados.Noentando,oprocessodeserializaopermitequehajaumacertapersonalizaodaserializaoedeserializaodeumobjeto.IssodeveseapossibilidadedasobrescriodosmtodoswriteObjectereadObjectdentrodaclasseaserserializada,comoaclasseexemplarpojo.Fruta.Estasobrescritapermiteumcontroletotalsobreaserializao,poisasclassesjava.io.ObjectOutputStreamejava.io.ObjectInputStream,aoserializaroestadodeumobjeto,primeiramenteverificamseessemtodofoisobrescritonaclassealvoeassimoutilizam,seno,serutilizadooprotocolopadrodeserializao.Realizandoasobrescriodosmtodospossvelcriptografarosdadosnaserializaoedescriptografarosdadosnadeserializao,pormeiodealgumalgoritmoqueoprogramadorvenhaimplementar.Assimosdadospodemserpersistidosoutransmitidosporrede,semquesejapossvelleraspartesmaisimportantesdoestadodeumobjeto.Nalistagem10,aclassepojo.Frutafoimodificadadandoorigemaclassepojo.FrutaSobrescritaquepossuiadicionamenteasobrescriodosmtodoswriteObjectereadObject.Comoesteapenasumexemplo,nofoiescritoumverdadeiroalgoritmodecriptografia,massimapenasumatrocanovalordaStringdocampocor,identificandoquehouveramalteraestantonoprocessodeserializaoquantonodedeserializao.Nalistagem11encontraseaexecuodaserializao.Listagem10SobrescritadosmtodoswriteObjectereadObject.12##sr#pojo.Fruta#######{###L##cort##Ljava/lang/String;L##nomeq#~##xpt##Vermelhat##Maa123456789101112131415161718192021importjava.io.Serializable;publicclassFrutaSobrescritaimplementsSerializable{privateStringnome;privateStringcor;staticfinallongserialVersionUID=123L;//indicaaversaodaclassepublicFrutaSobrescrita(Stringnome,Stringcor){this.nome=nome;this.cor=cor;}publicStringgetCor(){returncor;}publicStringgetNome(){returnnome;}publicvoidsetCor(Stringcor){this.cor=cor;}publicvoidsetNome(Stringnome){this.nome=nome;}privatevoidwriteObject(java.io.ObjectOutputStreamstream)throwsjava.io.IOException{//criptografarosdadosantesdeliberarostream//EXEMPLO:setCor(criptografar(getCor()));setCor(getCor()+">CRIPTOGRAFADO");//apenasconcatenaodestringparaindicaralterao08/07/2015 SerializaoSoluoParaPersistnciadeObjetoshttp://www.linhadecodigo.com.br/artigo/3401/serializacaosolucaoparapersistenciadeobjetos.aspx 8/11Listagem11Execuodaserializaodaclassepojo.FrutaSobrescrita.5.CONCLUSOAserializaoumprocedimentodesimplesexecuoporpartedoprogramador.Compoucotempodecodificaopossvelimplementarapersistenciadeumestadodeobjetoparaosistemadearquivosoudetransmissoporrede.possvelreproduzirosexemploscriadosnesteartigo,emsituaesatmesmomaiselaboradas.Aapresentaodealgunsproblemasesoluestrazidasporparticularidades,abreoentendimentodequeaserializaopodedeixardesersimplesconformeforaplicadaemdiferentescontextos,equeaomesmotempomuitoflexvelaopermitiraoprogramadorimplementardiferentessolues.AssistaaovdeoSerializao/DeserializaodeobjetoscomYAML6.BIBLIOGRAFIAORACLEjava.ioInterfaceSerializableDisponvelem:http://docs.oracle.com/javase/1.4.2/docs/api/java/io/Serializable.htmlAcessoem:11/03/2012222324252627282930313233343536//liberarostreamstream.defaultWriteObject();}privatevoidreadObject(java.io.ObjectInputStreamstream)throwsjava.io.IOException,ClassNotFoundException{//liberarstreamstream.defaultReadObject();//descriptografarosdados//EXEMPLO:setCor(descriptografar(getCor()));setCor(getCor()+">DESCRIPTOGRAFADO");//apenascontatenaodestringparaindicaralterao}}123456789101112131415161718//serializaSerializadors=newSerializador();FrutaSobrescritafrutaSobrescrita=newFrutaSobrescrita("Maa","Vermelha");try{s.serializar("/home/gustavo/frutaSobrescrita",frutaSobrescrita);}catch(Exceptionex){System.err.println("Falhaaoserializar!"+ex.toString());}//deserializaDeserializadord=newDeserializador();frutaSobrescrita=null;try{frutaSobrescrita=(FrutaSobrescrita)d.deserializar("/home/gustavo/frutaSobrescrita"}catch(Exceptionex){System.err.println("Falhaaodeserializar!"+ex.toString());}System.out.println("Sobrescrita:"+frutaSobrescrita.getNome()+""+frutaSobrescrita.getCor());08/07/2015 SerializaoSoluoParaPersistnciadeObjetoshttp://www.linhadecodigo.com.br/artigo/3401/serializacaosolucaoparapersistenciadeobjetos.aspx 9/11ORACLEDiscoverdeSecretsofJavaSerializationAPIDisponvelem:http://java.sun.com/developer/technicalArticles/Programming/serialization/Acessoem:11/03/2012NEWARD,Ted5coisasquevocnosabiasobre...SerializaodeObjetosJavaDisponvelem:http://www.ibm.com/developerworks/br/library/j5things1/index.htmlAcessoem:11/03/2012DOWNS,AndrewJavaSerializationDisponvelem:http://www.mactech.com/articles/mactech/Vol.14/14.04/JavaSerialization/index.htmlAcessoem:11/03/2012PREISSLER,LucianoE.GEYER,CludioF.R.SerializaoemJavaDisponvelem:http://www.inf.ufrgs.br/gppd/disc/cmp167/trabalhos/sem991/T1/luciano/final.htmAcessoem:11/03/2012EvertonCoimbradeArajoDesde1987atuanareadetreinamentoedesenvolvimento.ComoMestreemCinciadaComputao,professordaUNIVERSIDADETECNOLGICAFEDERALDOPARAN,CampusMedianeira,ondelecionadisciplinasrelacionadasaodesenvolvimentodeaplicaesweb,comJavae.NET.autordoslivrosDesenvolvimentoparaWEBcomJava,OrientaoaObjetoscomJavaSimples,FcileEficiente,AlgoritmoFundamentoePrticaemsuaterceiraedioedoslivrosDelphiImplementaoeTcnicasparaAmbientesVirtuaiseC++BuilderImplementaoeTcnicasparaAmbientesVirtuais.TodospelaVisualBooks.Podesercontactadoatravsdoemaileverton@utfpr.edu.brouevertoncoimbra@gmail.com.LeiatambmConhecendoainterfaceMapdoJavaJavaTrabalhandocomaInterfaceSetnoJavaJavaClassesWrappersemJavaJavaComboBoxModelemJavaJavaReduzindoaMutabilidadeemJavaJava0 72 3 0 408/07/2015 SerializaoSoluoParaPersistnciadeObjetoshttp://www.linhadecodigo.com.br/artigo/3401/serializacaosolucaoparapersistenciadeobjetos.aspx 10/11Publ i ci dade.netMag123 Easy.netmag41ASSINE VERTODASREVISTASDEVMEDIA1 ComandosbsicosemSQLinsert,update,deleteeselect2 HTMLBsico3 MenuemCSSMenudropdownhorizontalcomHTML5eCSS34 Excel:Comoverificarseexistevaloresduplicados5 PrincipaisInstruesemSQL6 CriandoumsistemadecadastroelogincomPHPeMySql7 FormatodosregistrosdoSintegraTOP10ARTIGOS TOP10AUTORES08/07/2015 SerializaoSoluoParaPersistnciadeObjetoshttp://www.linhadecodigo.com.br/artigo/3401/serializacaosolucaoparapersistenciadeobjetos.aspx 11/118 CdigoJavascriptIntroduo9 CdigoparabackgroundHTMLeCSS10 Excel:ComparandoListasVERTODOSAnuncie | FaleConosco | PubliqueCopyright2015todososdireitosreservadosparaWeb03VoccurtiuissoLinhadeCdigo13milcurtidas Curtiu