Você está na página 1de 11

08/07/2015

SerializaoSoluoParaPersistnciadeObjetos

Pesquisar

DesenvolvimentoJava

SerializaoSoluoParaPersistnciadeObjetos
NesteartigoapresentooGustavoRafaelValiati,quepodesercontatadopeloemailgustavovaliati@gmail.com.
OGustavofoimeualunoemalgumasdisciplinasdesuagraduoeestconclundooltimoperododocurso
deTecnologiaemAnliseeDesenvolvimentodeSistemasdaUTFPRcampusMedianeira,nesteprimeiro
semestrede2012.
porEvertonCoimb radeArajo

72

NesteartigoapresentooGustavoRafaelValiati,quepodesercontatadopeloemail
gustavovaliati@gmail.com.OGustavofoimeualunoemalgumasdisciplinasdesua
graduoeestconclundooltimoperododocursodeTecnologiaemAnlisee
DesenvolvimentodeSistemasdaUTFPRcampusMedianeira,nesteprimeiro
semestrede2012.

1.INTRODUO
Nemsempresedesejaterobjetosouestruturadedadosdeumaplicativo,comumciclodevidaque
duranomximootempoemqueforarmazenadoemmemriaRAM.Ouseja,algumasvezesdesejase
guardlosporumtempoindeterminado,sendopossvelrecuperlosposteriormente.Enestecaso,o
termopersistnciatemseuconceitodefinido.
Persistirdados,requerqueestespossamserserializveis.Aserializaopossibilitarcapturaro
estadodoobjetoouaestruturadedados,etransformaremumacadeiadebytesquandofor
necessrio.Tornasepossveltambm,recuperarosbytespersistidosparafazeroprocessoinverso,e
terosdadosdevoltaparaaaplicaoemexecuo.
Destamaneira,qualquerformadedadosqueestejasendotrabalhadanaaplicao,eestapuderser
serializada,poderserpassadaparaomeiofsico,eteroprocessorevertido.
Aserializaonoselimitaapenasempossibilitaragravaododadoemdisco,maspermitequeo
http://www.linhadecodigo.com.br/artigo/3401/serializacaosolucaoparapersistenciadeobjetos.aspx

1/11

08/07/2015

SerializaoSoluoParaPersistnciadeObjetos

mesmosejatransmitidoporrede.Istoporquaserializaocriaumstreamdebytes,querequisito
paratransmissodedadosporrede.
Diversaslinguagenspossuemsuporteserializao,como:Java,C,C++,Python,PHP,.NET,entre
outras.Nesteartigo,sertratadoapenasdaserializaocomJava,emsuaimplemetaobsica,
algunsproblemasesolues,comcdigosparaexemplificao.

2.SERIALIZAOCOMJAVA
Serializarumobjeto,emJava,spossvelcasosuaclasseestejamarcadacomoserializvel.Essa
marcaofeitacomasimplesimplementaodainterfacejava.io.Serializable.Essainterfaceno
possuimtodosparaseimplementarenematributos.AindanoexistiamasanotaesnoJava1.1,
versoquetrouxepelaprimeiravezaserializaoaoJava,edestamaneiraaimplementaoda
interfaceeraamelhormaneirademarcarumaclasse.
Aheranaentreclassesnaturalmenteafetadapelaserializao.Jquequandoumaclasse
implementaainterfaceSerializable,todaclassequedelaestendertambmestarimplicitamente
marcadacomoserializvel
.
Paraexemplo,sercriadaumaclassepojo.Frutaquecontmdoisatributos:nomeecor.Nocdigo
exemplo(Listagem1),podesenotaraclasseFrutamarcadaparaaserializao:
Listagem1Marcandoumaclassecomoserializvel.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

importjava.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;}
}

Podesedizerqueaimplementaodoprocessodeserializaoedeserializaosimplesdeumobjeto,
nopossuiumcdigodifcildeseescrever.Istoporquduasclassesfazemamaiorpartedotrabalho,
demaneiraquecompoucaslinhasdecdigopodesetransformarumobjetoembyteseviceversa.
Essasduasclassessojava.io.ObjectInputStreamquerecebebytesparacriarumobjetoe
java.io.ObjectOutputStreamquecriaumacadeiadebytesapartirdeumobjeto.

3.SERIALIZANDOEDESERIALIZANDOOESTADODEUMOBJETO
Comoexemplo,serpersistidoumobjetoemdisco.Paraisto,almdasclasses
http://www.linhadecodigo.com.br/artigo/3401/serializacaosolucaoparapersistenciadeobjetos.aspx

2/11

08/07/2015

SerializaoSoluoParaPersistnciadeObjetos

java.io.ObjectInputStreamejava.io.ObjectOutputStream,seroutilizadasduasoutrasquetrabalham
comarquivos,quesojava.io.FileInputStreamejava.io.FileOutputStream,queseguemamesma
lgicadeInputStreameOutputStream,squeagorarelacionadoaosistemadearquivosenoaos
objetos.
Paraserializao,devesecriarumnovojava.io.FileOutputStream,comocaminho(path)doarquivo
ondesedesejaarmazenaroestadodoobjeto.Tambmdevesercriadoumnovo
java.io.ObjectOutputStreamqueestligadoaoarquivo.Eporltimodeveseexecutaraescritado
objetoalvo,paradentrodoobjetodestreamqueporsuavezestligadoaoarquivodestino.Aps
executadosessespassos,possvelencontrarnosistemadearquivosumnovoarquivoquecontm
osbytescorrespondentesdescriodoestadodoobjeto.NaListagem2,encontraseocdigo
exemplo.
Listagem2Serializaodeumobjeto.
1
2
3
4
5
6
7
8
9
10
11
12
13
14

importjava.io.FileOutputStream;
importjava.io.ObjectOutputStream;

publicclassSerializador{

publicSerializador(){}

publicvoidserializar(Stringpath,Objectobj)throwsException{
FileOutputStreamoutFile=newFileOutputStream(path);
ObjectOutputStreams=newObjectOutputStream(outFile);
s.writeObject(obj);
s.close();
}
}

Eparaadeserializao,oprocessoextremamenteparecidocomaserializao.Criaseumnovo
java.io.FileInputStreamrelacionadoaoarquivoondeoestadodoobjetoencontrasepersistido.Deve
secriartambmumnovojava.io.ObjectInputStreamqueestarvinculadoaoarquivodeorigem.Por
ltimo,executasealeituradoarquivoparaarestauraodoestado.NaListagem3encontraseo
exemplodocdigo.
Listagem3Deserializaodeumobjeto.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

importjava.io.FileInputStream;
importjava.io.ObjectInputStream;

publicclassDeserializador{

publicDeserializador(){}

publicObjectdeserializar(Stringpath)throwsException{
FileInputStreaminFile=newFileInputStream(path);
ObjectInputStreamd=newObjectInputStream(inFile);
Objecto=d.readObject();
d.close();
returno;
}
}

http://www.linhadecodigo.com.br/artigo/3401/serializacaosolucaoparapersistenciadeobjetos.aspx

3/11

08/07/2015

SerializaoSoluoParaPersistnciadeObjetos

AListagem4,contmoexemplodaexecuodaserializaoeemseguidadadeserializao.
Listagem4SerializandoeDeserializando
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

importoperacoes.Deserializador;
importoperacoes.Serializador;
importpojo.Fruta;

publicclassPrincipal{
publicstaticvoidmain(Stringargs[]){
//serializa
Serializadors=newSerializador();
Frutafruta=newFruta("Maa","Vermelha");
try{
s.serializar("/home/gustavo/fruta",fruta);
}catch(Exceptionex){
System.err.println("Falhaaoserializar!"+ex.toString());
}

//deserializa
Deserializadord=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());
}
}

NaListagem5,encontraseumexemplodeserializaoedeserializaodeumArrayListdaclasse
Fruta.apenasmaisumexemploquedemonstraacapacidadedesepersistirqualquerobjetoque
sejaserializvel.EssaserializaosfoipossvelporqueaclasseArrayListimplementaainterface
Serializableporpadro.
Listagem5SerializaodeArrayList.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

//serializaoedeserializaocomArrayList
ArrayList<Fruta>frutas=newArrayList<Fruta>();
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<Fruta>)d.deserializar("/home/gustavo/frutas");
for(Frutaf:frutas){
System.out.println("ArrayList:"+f.getNome()+""+f.getCor());
}
}catch(Exceptionex){
System.err.println("Falhaaoserializaroudeserializar!"+
ex.toString());
}

http://www.linhadecodigo.com.br/artigo/3401/serializacaosolucaoparapersistenciadeobjetos.aspx

4/11

08/07/2015

SerializaoSoluoParaPersistnciadeObjetos

4.PARTICULARIDADESDASERIALIZAO
Comodito,aserializaodeumobjetoemJavapodeseralgofcildesefazer.Masexistemcertas
informaesquesoimportantesesablaspodeevitarvriosproblemas.
Umdosproblemasquenemtudopodeserserializado,comoobjetosdasclassesThreadeSocket
eatributosestticos.Osatributosestticosestovinculadosclasseenoaoobjeto.Assimquando
setratadoestadodoobjeto,oscamposestticosnosoconsiderados.EmrelaosThreads,suas
instnciasssoteisenquantoestiverememexecuonaJVM,epodemserparadas/destrudase
iniciadascominstruesdesuaclasse.Noexistealgonoestadodestasinstnciasquesejatilpara
sepersistir,eporissonohsentidoempersistirtaisinstnciaspararestaurarposteriormente.
Maseseexistiralgumaclasseemquesejanecessriopersistila,eestapossuiumainstnciada
classeThread?Nestecaso,utilizandoumrecursopodesepersistiraclasseinteira,menosa
instnciathread.Esterecurso,refereseemindicarquetalinstnciathreadumobjetoTransient.Na
Listagem6encontraseumexemplodaimplementaocomusodeTransient.
Listagem6UsodoTransient
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

importjava.io.Serializable;

publicclassImplementacaoTransientimplementsSerializable,Runnable{

transientprivateThreadthread;
//marcadocom"transient"paraquesuainstncianosejaserializada

//Demaisvaloresdeestadoseroserializados
privateintvalorParaPersistir;

publicImplementacaoTransient(intvalorParaPersistir){
this.valorParaPersistir=valorParaPersistir;
thread=newThread(this);
thread.start();
}

publicvoidrun()
{
while(true){
//cdigoaserexecutadopelaThread
}
}
}

Valeressaltarque,oqueserializadoapenasoestadodoobjeto,enoosmtodoseaclasse.No
exemploacima,apenasainstnciadoobjetothreadedoobjetovalorParaPersistircompunhamo
estadodoobjeto.Assim,evitasequeosistemadeserializaotenteserializarumobjetono
serializvelegereerros.ApsadeserializaodeumobjetodaclasseImplementacaoTransienteste
estartotalmentefuncional.
Umoutroproblemaquepodeviraocorrer,serefereaoversionamentodasclasses.Todaclasse
possuiumatributoocultochamadoserialVersionUIDcomumvalorgeradoautomaticamente.Objetos
criadoslevamconsigooserialVersionUIDdesuaclasse,queindicasuaverso.Todavezqueuma
classesofrealteraesemseucdigo,umnovoserialVersionUIDgerado.Oproblemacoma
http://www.linhadecodigo.com.br/artigo/3401/serializacaosolucaoparapersistenciadeobjetos.aspx

5/11

08/07/2015

SerializaoSoluoParaPersistnciadeObjetos

serializaosurgequandoserializaseoestadodeumobjetoeposteriormentetentaserestauraro
estadoparaaaplicao,mashouverammudanasnocdigodaclasse.Nestecaso,umaexceo
java.io.InvalidClassExceptiondisparada,poisdefato,oestadodoobjetocorrespondeaumaverso
declassedoqualfoicriadoquejnoexistemais.Portanto,issosocorreparaevitarerrosde
programao,emquetentaserestauraroestadodeumobjetoparaumaclassequepossuiverso
diferentedaqualoobjetofoiserializadoinicialmente.Eissopodesignificardiferentesversesdeuma
mesmaclasseFrutaporexemplo,oudiferentesversesporclassesseremtotalmentediferentes
como:oestadodeumobjetodaclasseFrutaserrestauradoparaclasseCarro.
Masquandonecessrio,conscientemente,recuperaroestadodeumobjeto,mesmoquehouveram
alteraesnaclassedoqualfoigerado,possvelcontrolarmanualmenteoserialVersionUID.Para
isto,bastadeclararexplicitamentenaformadeatributoestticoefinal,umvalorLongqualquerpara
corresponderversodaclasse.Eassim,mesmoquehouveremmodificaesnaclasse,averso
permeneceramesma,evitandoasexceesdaincompatiblidadedeclasses.Noentanto,vale
ressaltarqueoversionamentonoumimpeclioparaoprogramador,massimmuitoimportanteem
LOGIN
casosquedesejasemanterumcontrolesobreacompatibilidadedecdigonaaplicao,definindo
versesparaclassesNocdigodaListagem7encontraseoexemplodocontrolemanualdo
serialVersionUID.
Listagem7UsomanualdoserialVersionUID
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

importjava.io.Serializable;

publicclassFrutaimplementsSerializable{
privateStringnome;
privateStringcor;
staticfinallongserialVersionUID=123L;//indicaaversaodaclasse

publicFruta(Stringnome,Stringcor){
this.nome=nome;
this.cor=cor;
}
publicStringgetCor(){returncor;}
publicStringgetNome(){returnnome;}
publicvoidsetCor(Stringcor){this.cor=cor;}
publicvoidsetNome(Stringnome){this.nome=nome;}
}

OJDKforneceumaferramentaquepermitevisualizaraversodequalquerclasseJava.Bastano
terminaldosistemaoperacionalutilizarocomandoserialverseguidodaclassequalificada,conforme
exemplodaListagem8.
Listagem8Verificaodaversodeclasse
1

serialverpojo.Fruta

Aserializaoacabainflingindoalgunsmodelosdeseguranaemseuprocedimentopadro,ecriando
entoumnovoproblema.Quandoumestadodeobjetopersistidonosistemadearquivosouenviado
porrede,ofluxobinriopodeserdetectado,analisadoeobtidasinformaessobreaclasseeo
estadodoobjeto.Porexemplo,seutilizadoumeditordetextoqualquerparaabriroarquivopersistido
http://www.linhadecodigo.com.br/artigo/3401/serializacaosolucaoparapersistenciadeobjetos.aspx

6/11

08/07/2015

SerializaoSoluoParaPersistnciadeObjetos

doestadodoobjetodaclasseFrutadosexemplosanteriores,comumosatributoseoutras
informaesapareceremcomoumsimplestexto,totalouparcilamentelegveis,assimcomo
demonstradonaListagem9.
Listagem9Exemplodeleituradearquivobinriodeumestadodeobjetopersistido.
1
2

##sr#
pojo.Fruta#######{###L##cort##Ljava/lang/String;L##nomeq#~##xpt##Vermelhat##Maa

Comumaferramentamenossimplesseriapossvelaumentaraquantidadedeinformaeslegveis,
coletandoumamaiorquantiadedados.
Noentando,oprocessodeserializaopermitequehajaumacertapersonalizaodaserializaoe
deserializaodeumobjeto.IssodeveseapossibilidadedasobrescriodosmtodoswriteObjecte
readObjectdentrodaclasseaserserializada,comoaclasseexemplarpojo.Fruta.Estasobrescrita
permiteumcontroletotalsobreaserializao,poisasclassesjava.io.ObjectOutputStreame
java.io.ObjectInputStream,aoserializaroestadodeumobjeto,primeiramenteverificamseesse
mtodofoisobrescritonaclassealvoeassimoutilizam,seno,serutilizadooprotocolopadrode
serializao.
Realizandoasobrescriodosmtodospossvelcriptografarosdadosnaserializaoe
descriptografarosdadosnadeserializao,pormeiodealgumalgoritmoqueoprogramadorvenha
implementar.Assimosdadospodemserpersistidosoutransmitidosporrede,semquesejapossveller
aspartesmaisimportantesdoestadodeumobjeto.Nalistagem10,aclassepojo.Frutafoi
modificadadandoorigemaclassepojo.FrutaSobrescritaquepossuiadicionamenteasobrescrio
dosmtodoswriteObjectereadObject.Comoesteapenasumexemplo,nofoiescritoum
verdadeiroalgoritmodecriptografia,massimapenasumatrocanovalordaStringdocampocor,
identificandoquehouveramalteraestantonoprocessodeserializaoquantonodedeserializao.
Nalistagem11encontraseaexecuodaserializao.
Listagem10SobrescritadosmtodoswriteObjectereadObject.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

importjava.io.Serializable;

publicclassFrutaSobrescritaimplementsSerializable{
privateStringnome;
privateStringcor;
staticfinallongserialVersionUID=123L;//indicaaversaodaclasse

publicFrutaSobrescrita(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");//apenasconcatenaodestringparaindicaral

http://www.linhadecodigo.com.br/artigo/3401/serializacaosolucaoparapersistenciadeobjetos.aspx

7/11

08/07/2015

22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

SerializaoSoluoParaPersistnciadeObjetos

//liberarostream
stream.defaultWriteObject();
}

privatevoidreadObject(java.io.ObjectInputStreamstream)throwsjava.io.IOException,Clas
{
//liberarstream
stream.defaultReadObject();

//descriptografarosdados
//EXEMPLO:setCor(descriptografar(getCor()));
setCor(getCor()+">DESCRIPTOGRAFADO");//apenascontatenaodestringparaindicar
}
}

Listagem11Execuodaserializaodaclassepojo.FrutaSobrescrita.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

//serializa
Serializadors=newSerializador();
FrutaSobrescritafrutaSobrescrita=newFrutaSobrescrita("Maa","Vermelha");
try{
s.serializar("/home/gustavo/frutaSobrescrita",frutaSobrescrita);
}catch(Exceptionex){
System.err.println("Falhaaoserializar!"+ex.toString());
}

//deserializa
Deserializadord=newDeserializador();
frutaSobrescrita=null;
try{
frutaSobrescrita=(FrutaSobrescrita)d.deserializar("/home/gustavo/frutaSobrescrit
}catch(Exceptionex){
System.err.println("Falhaaodeserializar!"+ex.toString());
}
System.out.println("Sobrescrita:"+frutaSobrescrita.getNome()+""+frutaSobrescr

5.CONCLUSO
Aserializaoumprocedimentodesimplesexecuoporpartedoprogramador.Compoucotempo
decodificaopossvelimplementarapersistenciadeumestadodeobjetoparaosistemade
arquivosoudetransmissoporrede.possvelreproduzirosexemploscriadosnesteartigo,em
situaesatmesmomaiselaboradas.Aapresentaodealgunsproblemasesoluestrazidaspor
particularidades,abreoentendimentodequeaserializaopodedeixardesersimplesconformefor
aplicadaemdiferentescontextos,equeaomesmotempomuitoflexvelaopermitiraoprogramador
implementardiferentessolues.
AssistaaovdeoSerializao/DeserializaodeobjetoscomYAML

6.BIBLIOGRAFIA
ORACLEjava.ioInterfaceSerializableDisponvelem:http://docs.oracle.com/javase/1.4.2/docs/ap
i/java/io/Serializable.htmlAcessoem:11/03/2012
http://www.linhadecodigo.com.br/artigo/3401/serializacaosolucaoparapersistenciadeobjetos.aspx

8/11

08/07/2015

SerializaoSoluoParaPersistnciadeObjetos

ORACLEDiscoverdeSecretsofJavaSerializationAPIDisponvelem:http://java.sun.com/devel
oper/technicalArticles/Programming/serialization/Acessoem:11/03/2012
NEWARD,Ted5coisasquevocnosabiasobre...SerializaodeObjetosJavaDisponvel
em:http://www.ibm.com/developerworks/br/library/j5things1/index.htmlAcessoem:11/03/2012
DOWNS,AndrewJavaSerializationDisponvelem:http://www.mactech.com/articles/mactech/Vol.1
4/14.04/JavaSerialization/index.htmlAcessoem:11/03/2012
PREISSLER,LucianoE.GEYER,CludioF.R.SerializaoemJavaDisponvelem:http://www.in
f.ufrgs.br/gppd/disc/cmp167/trabalhos/sem991/T1/luciano/final.htmAcessoem:11/03/2012

EvertonCoimbradeArajoDesde1987atuanareadetreinamentoedesenvo
lvimento.ComoMestreemCinciadaComputao,professordaUNIVERSIDAD
ETECNOLGICAFEDERALDOPARAN,CampusMedianeira,ondelecionadisc
iplinasrelacionadasaodesenvolvimentodeaplicaesweb,comJavae.NET.
autordoslivrosDesenvolvimentoparaWEBcomJava,OrientaoaObjetoscomJavaSimpl
es,FcileEficiente,AlgoritmoFundamentoePrticaemsuaterceiraedioedoslivrosDelphi
ImplementaoeTcnicasparaAmbientesVirtuaiseC++BuilderImplementaoeTcnicas
paraAmbientesVirtuais.TodospelaVisualBooks.Podesercontactadoatravsdoemaileverto
n@utfpr.edu.brouevertoncoimbra@gmail.com.

72

Leiatambm
ConhecendoainterfaceMapdoJava
Java

TrabalhandocomaInterfaceSetnoJava
Java

ClassesWrappersemJava
Java

ComboBoxModelemJava
Java

ReduzindoaMutabilidadeemJava
Java

http://www.linhadecodigo.com.br/artigo/3401/serializacaosolucaoparapersistenciadeobjetos.aspx

9/11

08/07/2015

SerializaoSoluoParaPersistnciadeObjetos

Publicidade

REVISTASDEVMEDIA

.netMag123

Easy.netmag41
VERTODAS

TOP10ARTIGOS

ASSINE

TOP10AUTORES

ComandosbsicosemSQLinsert,
update,deleteeselect

HTMLBsico

MenuemCSSMenudropdownhorizontal
comHTML5eCSS3

Excel:Comoverificarseexistevalores
duplicados

PrincipaisInstruesemSQL

Criandoumsistemadecadastroelogin
comPHPeMySql

FormatodosregistrosdoSintegra

http://www.linhadecodigo.com.br/artigo/3401/serializacaosolucaoparapersistenciadeobjetos.aspx

10/11

08/07/2015

SerializaoSoluoParaPersistnciadeObjetos

CdigoJavascriptIntroduo

CdigoparabackgroundHTMLeCSS

10

Excel:ComparandoListas
VERTODOS

Anuncie | FaleConosco | Publique

LinhadeCdigo
Curtiu

13milcurtidas

Voccurtiuisso

Copyright2015todososdireitosreservadosparaWeb03

http://www.linhadecodigo.com.br/artigo/3401/serializacaosolucaoparapersistenciadeobjetos.aspx

11/11

Você também pode gostar