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

Post on 16-Aug-2015

2 views 0 download

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