serializare c#

Upload: simona-diana

Post on 10-Feb-2018

240 views

Category:

Documents


0 download

TRANSCRIPT

  • 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