Upload
simona-diana
View
240
Download
0
Embed Size (px)
Citation preview
7/22/2019 Serializare c#
1/23
Serializarea obiectelor
Ce este serializarea ?
Serializarea tipurilor primitive
Serializarea obiectelorObjectInputStream
ObjectOutputStream
Interfata Serializable
Controlul serializariiPersonalizarea serializarii
Clonarea obiectelor
1
7/22/2019 Serializare c#
2/23
Ce este serializarea ?
Serializare= transformarea unui obiectntr-o secventa de octeti, din care sapoata fi refacut ulterior obiectul origi-nal.
Procesul invers, de citire a unui obiectserializat pentru a-i reface starea origi-nala, se numeste deserializare.
Referintele care construiesc starea unuiobiect formeaza o ntreaga retea de obiecte.
DataOutputStream, DataInputStream
ObjectOutputStream, ObjectInputStre
2
7/22/2019 Serializare c#
3/23
Utilitatea serializarii
Mecanism simplu de utilizat pentrusalvarea si restaurarea datelor.
Persistenta obiectelor
Compensarea diferentelor ntresisteme de operare
Transmiterea datelor n retea
RMI (Remote Method Invocation)
Java Beans - asigurarea persistenteicomponentelor.
3
7/22/2019 Serializare c#
4/23
Serializarea tipurilor primitive
DataOutputStream, DataInputStream
//Scriere
FileOutputStream fos =
new FileOutputStream("test.dat");
DataOutputStream out = new DataOutputStream(fos);out.writeInt(12345);
out.writeDouble(12.345);
out.writeBoolean(true);
out.writeUTF("Sir de caractere");
out.flush();
fos.close();
...//Citire
FileInputStream fis =
new FileInputStream("test.dat");
DataInputStream in = new DataInputStream(fis);
int i = in.readInt();
double d = in.readDouble();
boolean b = in.readBoolean();String s = in.readUTF();
fis.close();
4
7/22/2019 Serializare c#
5/23
Serializarea obiectelor
ObjectOutputStream
ObjectInputStream
Mecanismul implicit va salva: Numele clasei obiectului.
Signatura clasei.
Valorile tuturor campurile serializabile.
Acesta este un proces recursiv, de se-rializare a obiectelor referite (reteauade obiecte);
Metode:
writeObject, pentru scriere si readObject, pentru restaurare.
5
7/22/2019 Serializare c#
6/23
Clasa ObjectOutputStream
ObjectOutputStream out =
new ObjectOutputStream(fluxPrimitiv);
out.writeObject(referintaObiect);
out.flush();
fluxPrimitiv.close();
FileOutputStream fos =new FileOutputStream("test.ser");
ObjectOutputStream out = new ObjectOutputStream(fo
out.writeObject("Ora curenta:");
out.writeObject(new Date());
out.writeInt(12345);
out.writeDouble(12.345);
out.writeBoolean(true);out.writeUTF("Sir de caractere");
out.flush();
fos.close();
Exceptii: IOException, NotSerializableException,
InvalidClassException.
6
7/22/2019 Serializare c#
7/23
Clasa ObjectInputStream
ObjectInputStream in =
new ObjectInputStream(fluxPrimitiv);
Object obj = in.readObject();
//sau
TipReferinta ref = (TipReferinta)in.readObject();
fluxPrimitiv.close();
FileInputStream fis = new FileInputStream("test.ser
ObjectInputStream in = new ObjectInputStream(fis);
String mesaj = (String)in.readObject();
Date data = (Date)in.readObject();
int i = in.readInt();
double d = in.readDouble();boolean b = in.readBoolean();
String s = in.readUTF();
fis.close();
7
7/22/2019 Serializare c#
8/23
Interfata Serializable
Un obiect este serializabil clasa dincare face parte implementeaza interfataSerializable.
Interfata este declarativa, definitiaei fiind:
package java.io;
public interface Serializable {
// Nimic !
}
public class ClasaSerializabila
implements Serializable {
// Corpul clasei
}
8
7/22/2019 Serializare c#
9/23
Controlul serializarii
Modificatorul transient
transient private double temp;
// Ignorata la serializare
Modificatorul static anuleaza efectulmodificatorului transient
static transient int N;
// Participa la serializare
9
7/22/2019 Serializare c#
10/23
Listing 1: Modificatorii static si transientimport j a v a . i o . * ;
p u bl i c c l as s Test1 i m p l e m e n t s S e r i al i z a bl e {
in t x = 1 ; //DA
t r a ns i e nt i n t y = 2 ; //NU
t r a ns i e nt s t a ti c i n t z = 3 ; //DA
s t at i c i n t t=4; //DA
public S t ri ng t o St r in g ( ) {
return x + " , " + y + " , " + z + " , " + t ;
}
}
10
7/22/2019 Serializare c#
11/23
Membrii neserializabili
In procesul serializarii, daca este ntalnitun obiect care nu implementeaza interfataSerializable atunci va fi generata oexceptie de tipul
NotSerializableException ce va iden-tifica respectiva clasa neserializabila.
Listing 2: Membrii neserializabili
import j a v a . i o . * ;
class A {
in t x = 1 ;
}
class B i m p l e m e n t s S e r i al i z ab l e {
in t y = 2 ;
}
p u bl i c c l as s Test2 i m p l e m e n t s S e r i a l i z a b l e {
A a = new A ( ) ; / / E x c e p t i e
B b = new B ( ) ; //DA
public S t ri ng t o St r in g ( ) {return a . x + " , " + b . y ;
}
}
11
7/22/2019 Serializare c#
12/23
Serializarea campurilor mostenite
Listing 3: Serializarea campurilor mostenite
import j a v a . i o . * ;
class C {
in t x = 0 ;
/ / O b l ig a t o ri u c o n st r u c to r f a ra a r g um e n te
}
class D extends C i m p l e m e n t s S e r i al i z a bl e {
in t y = 0 ;
}
p u bl i c c l as s Test3 extends D {
public T es t3 ( ) {
x = 1; / / N U
y = 2; / / D A
}
public S t ri ng t o St r in g ( ) {
return x + " , " + y ;}
}
12
7/22/2019 Serializare c#
13/23
Listing 4: Testarea serializariiimport j a v a . i o . * ;
p u bl i c c l as s E x e mp l u {
p u bl i c s t a ti c v o id t e st ( O b j e ct o bj ) throws I O E xc e p t io n {
/ / S a lv a m
F i l e Ou t p u tS t r e am f os = ne w F i l e O u t p u t S t r e a m ( " f i s i e r . s e r " )
;
O b j e ct O u t pu t S t re a m o u t = ne w O b j e c t O u t p u t S t r e a m ( f o s ) ;
o u t . w r i t e O b j e c t ( o b j ) ;
o u t . f l u s h ( ) ;
f o s . c l o s e ( ) ;
S ys t em . o ut . p r in tl n ( " A f os t s al va t o b ie c tu l : " + o bj ) ;
/ / R e s ta u r am
F i l e In p u t St r e a m f i s = ne w F i l e I n p u t S t r e a m ( " f i s i e r . s e r " ) ;
O b j e ct I n p ut S t r ea m i n = ne w O b j e c t I n p u t S t r e a m ( f i s ) ;
try {
o bj = i n . r e a dO b j e ct ( ) ;
} catch ( C l a s s N o tF o u n d Ex c e p ti o n e ) {
e . p r i n t S t a c k T r a c e ( ) ;
}
f i s . c l o s e ( ) ;
S ys t em . o ut . p r in tl n ( " A f os t r e st a ur a t o bi e ct ul : " + o bj ) ;
}
p u bl i c s t a ti c v o id m a in ( S t r i ng a r gs [ ] ) throws I O E xc e p t io n {
t e s t ( new T e s t 1 ( ) ) ;
try {
t e s t ( ne w T e s t 2 ( ) ) ;
} catch ( N o t S e r i al i z a b le E x c e pt i o n e ) {
S y s te m . o u t . p r in t l n ( " O bi e c t n e s e ri a l i za b i l : " + e ) ;
}
t e s t ( new T e s t 3 ( ) ) ;}
}
13
7/22/2019 Serializare c#
14/23
Personalizarea serializarii
Dezavantajele mecanismului implicit:
lent
reprezentarea voluminoasa
Personalizarea serializarii:
private void writeObject(ObjectOutputStream stream)
throws IOException {
// Procesarea campurilor clasei (criptare, etc.)
// Scrierea obiectului curent
stream.defaultWriteObject();// Adaugarea altor informatii suplimentare
}
private void readObject(ObjectInputStream stream)
throws IOException,ClassNotFoundException {
// Restaurarea obiectului curent
stream.defaultReadObject();
// Actualizarea starii obiectului (decriptare, etc// si extragerea informatiilor suplimentare
}
14
7/22/2019 Serializare c#
15/23
Controlul versiunilor claselor
Listing 5: Prima varianta a clasei Angajat
import j a v a . i o . * ;
class Angajat i m p l e m e n t s S e r i al i z a bl e {
public S t r in g n u me ;
p u bl i c i n t s a l a r i u ;
private S t ri n g p a r ol a ;
public A n g aj a t ( S t r in g n um e , in t s a la r iu , S t ri n g p a ro l a ) {
this . n um e = n um e ;
this . s a la r iu = s a la ri u ;
this . p a ro la = p ar ol a ;
}
public S t ri ng t o St r in g ( ) {
return n um e + " ( " + s al ar iu + " )" ;
}
}
15
7/22/2019 Serializare c#
16/23
Listing 6: Aplicatia de gestionare a angajatilorimport j a v a . i o . * ;
import j a v a . u t i l . * ;
p u bl i c c l as s G e s t iu n e A ng a j a ti {
/ / L i st a a n g aj a t i lo r
A r ra y Li s t a ng = ne w A r r a y L i s t ( ) ;
p u bl i c v o id c i t i r e ( ) throws I O E x ce p t i on {
F i l e In p u t St r e a m f i s = null ;
try {
f is = new F i l e I n p u t S t r e a m ( " a n g a j a t i . s e r " ) ;
O b j e ct I n p ut S t r e am i n = ne w O b j e c t I n p u t S t r e a m ( f i s ) ;
a ng = ( A r r a y Li s t ) i n . r e a dO b j e ct ( ) ;
} catch ( F i l e N o t Fo u n d E xc e p t i on e ) {
S y s t e m . o u t . p r i n t l n ( " F i s i e r u l n o u . . . " ) ;
} catch ( E x ce p ti o n e ) {
S y st e m . o ut . p r i n t ln ( " E r o a re l a c i t ir e a d a t el o r . . . " ) ;
e . p r i n t S t a c k T r a c e ( ) ;
} finally {
if ( f is ! = null )
f i s . c l o s e ( ) ;
}
S y st e m . o u t . p r in t l n ( " L is t a a n g a ja t i l or : \ n " + a n g ) ;
}
p u bl i c v o id s a l v a r e ( ) throws I O E x ce p t i on {
F i l e Ou t p u tS t r e am f os =
ne w F i l e O u t p u t S t r e a m ( " a n g a j a t i . s e r " ) ;
O b j e ct O u t pu t S t re a m o u t = ne w O b j e c t O u t p u t S t r e a m ( f o s ) ;
o u t . w r i t e O b j e c t ( a n g ) ;
}
p u bl i c v o id a d a u g a r e ( ) throws I O E xc e p ti o n {
B u f f er e d R ea d e r s t di n = new B u f f e r e d R e a d e r (
ne w I n p u t S t r e a m R e a d e r ( S y s t e m . i n ) ) ;
while ( true ) {S y s t e m . o u t . p r i n t ( " \ n N u m e : " ) ;
S t ri n g n u me = s t di n . r e a d Li n e ( ) ;
S y s t e m . o u t . p r i n t ( " S a l a r i u : " ) ;
in t s a l ar i u = I n t eg e r . p a r se I n t ( s t di n . r e a d Li n e ( ) ) ;
16
7/22/2019 Serializare c#
17/23
S y s t e m . o u t . p r i n t ( " P a r o l a : " ) ;
S t ri n g p a ro l a = s t di n . r e a d Li n e ( ) ;
a n g . a d d ( ne w A n g a j a t ( n u me , s a l ar i u , p a r o l a ) ) ;
S y st e m . o ut . p r i n t ( " M ai a d a ug a t i ? ( D / N ) " ) ;
S t ri n g r a s pu n s = s t di n . r e a d Li n e ( ) . t o U pp e r C as e ( ) ;
if ( r a s p u n s . s t a r t s W i t h ( " N " ) )
break ;
}
}
p u bl i c s t a ti c v o id m a in ( S t r i ng a r gs [ ] ) throws I O E xc e p t io n {
G e s t iu n e A ng a j a ti a pp = ne w G e s t i u n e A n g a j a t i ( ) ;
/ / I n c ar c a m a n g aj a t ii d in f i s ie r
a p p . c i t i r e ( ) ;
/ / A d a ug a m n oi a n g aj a t i
a p p . a d a u g a r e ( ) ;
/ / S a lv a m a n g aj a t ii i n ap o i f i si e r
a p p . s a l v a r e ( ) ;
}
}
Adaugam un nou camp: adresa.
Problema: InvalidClassException
17
7/22/2019 Serializare c#
18/23
serialVersionUID
numar pe 64 de biti
generat n procesul de serializare/de-serializare
salvat mpreuna cu starea obiectului
codifica signatura unei clase
sensibil la orice modificare a clasei
Setarea explicita:static final long
serialVersionUID = /* numar_serial_clasa */;
Utilitarul serialVer permite gener-area numarului serialVersionUID
18
7/22/2019 Serializare c#
19/23
Listing 7: Varianta compatibila a clasei Angajatimport j a v a . i o . * ;
class Angajat i m p l e m e n t s S e r i al i z a bl e {
s t at i c f i na l l o ng s e r i al V e r si o n U ID = 5 6 5 3 49 3 2 4 86 8 0 6 6 52 9 7 L ;
public S t r in g n um e , a d re s a ;
p u bl i c i n t s a l a r i u ;
private S t ri n g p a r ol a ;
public A n g aj a t ( S t r in g n um e , in t s a la r iu , S t ri n g p a ro l a ) {
this . n um e = n um e ;
this . a d re sa = " I as i " ;
this . s a la r iu = s a la ri u ;
this . p a ro la = p ar ol a ;
}
public S t ri ng t o St r in g ( ) {
return n um e + " ( " + s al ar iu + " )" ;
}
}
19
7/22/2019 Serializare c#
20/23
Listing 8: Varianta securizata a clasei Angajatimport j a v a . i o . * ;
class Angajat i m p l e m e n t s S e r i al i z a bl e {
s t at i c f i na l l o ng s e r i al V e r si o n U ID = 5 6 5 3 49 3 2 4 86 8 0 6 6 52 9 7 L ;
public S t r in g n um e , a d re s a ;
p u bl i c i n t s a l a r i u ;
private S t ri n g p a r ol a ;
public A n g aj a t ( S t r in g n um e , in t s a la r iu , S t ri n g p a ro l a ) {
this . n um e = n um e ;
this . a d re sa = " I as i " ;
this . s a la r iu = s a la ri u ;
this . p a ro la = p ar ol a ;
}
public S t ri ng t o St r in g ( ) {
return n um e + " ( " + s al ar iu + " )" ;
}
static S t r in g c r i pt a r e ( S t ri n g i np ut , in t o ff s et ) {
S t ri n gB u ff e r s b = ne w S t r i n g B u f f e r ( ) ;
for ( int n = 0 ; n < i n p ut . l e n g th ( ) ; n + + )
s b . a p p e n d ( ( char ) ( o f f s e t + i n p u t . c h a r A t ( n ) ) ) ;return s b . t o S t r i n g ( ) ;
}
p r i va t e v o id w r i t e O b j e c t ( O b j e c t O u t p u t S t r e a m s t r e a m )
throws I O E xc e p t io n {
p a ro l a = c r i pt a r e ( p ar o la , 3 ) ;
s t r e a m . d e f a u l t W r i t e O b j e c t ( ) ;
p a ro l a = c r i pt a r e ( p ar o la , - 3) ;
}
p r i va t e v o id r e a d O b j e c t ( O b j e c t I n p u t S t r e a m s t r e a m )
throws I O E x c e pt i o n , C l a s s N o t F o u n d E x c e p t i o n {
s t r e a m . d e f a u l t R e a d O b j e c t ( ) ;p a ro l a = c r i pt a r e ( p ar o la , - 3) ;
}
}
20
7/22/2019 Serializare c#
21/23
Interfata Externalizable
Control complet, explicit al pro-cesului de serializare.
Definitia interfetei Externalizable:
package java.io;public interface Externalizable
extends Serializable {
public void writeExternal(ObjectOutput out)
throws IOException;
public void readExternal(ObjectInput in)
throws IOException, ClassNotFoundException;}
Scop: cresterea vitezei procesului deserializare.
21
7/22/2019 Serializare c#
22/23
Listing 9: Serializare implicitaimport j a v a . i o . * ;
class Persoana i m p l e m e n t s S e r i al i z a bl e {
in t c o d ;
S t ri n g n u me ;
public P e r so a n a ( S t ri n g n um e , in t c od ) {
this . n um e = n um e ;
this . cod = cod ;
}
}
Listing 10: Serializare proprie
import j a v a . i o . * ;
class Persoana i m p l e m e n t s E x t e rn a l i za b l e {
in t c o d ;
S t ri n g n u me ;
public P e r so a n a ( S t ri n g n um e , in t c od ) {
this . n um e = n um e ;this . cod = cod ;
}
p u bl i c v o id w r i t eE x t er n a l ( O b j e c tO u t pu t s )
throws I O E xc e p t io n {
s . w r i t e U T F ( n u m e ) ;
s . w r i t e I n t ( c o d ) ;
}
p u bl i c v o id r e a d Ex t e r na l ( O b j e c t In p u t s )
throws C l a s s N o t F o u n d Ex c e p t i o n , I O E x c e p t i o n {
n um e = s . r ea d UT F ( ) ;
c od = s . r ea dI n t () ;}
}
22
7/22/2019 Serializare c#
23/23
Clonarea obiectelor
TipReferinta o1 = new TipReferinta();
TipReferinta o2 = (TipReferinta) o1.clone();
public Object clone() {
try {
ByteArrayOutputStream baos =
new ByteArrayOutputStream();ObjectOutputStream out =
new ObjectOutputStream(baos);
out.writeObject(this);
out.close();
byte[] buffer = baos.toByteArray();
ByteArrayInputStream bais =new ByteArrayInputStream(buffer);
ObjectInputStream in = new ObjectInputStream(bai
Object ret = in.readObject();
in.close();
return ret;
} catch (Exception e) { return null; }
}
23