Sunteți pe pagina 1din 8

Curs: Core Java Programming

Module: Gestionarea sistemului de fișiere


Unitate: Serializarea

Există cazuri în care este necesară stocarea stării obiectelor create într-
o aplicație. Acest lucru înseamnă de obicei stocarea tuturor
caracteristicilor unui obiect într-un depozit specific, într-un format
caracteristic, recognoscibil pentru sistem. O descriere a obiectului
stocat astfel este mai apoi descărcată din depozit atunci când este
nevoie și este restaurată în forma sa originală. Acest proces se
numește serializare și deserializare (Object Streaming).

Există două tipuri de serializare, folosite în mod frecvent. Una este


serializarea binară, în care conţinutul se stochează în format binar,
neinteligibil pentru om, şi cealaltă este serializarea textuală, puţin mai
lizibilă, care subînţelege stocarea datelor în format XML, JSON sau într-
un alt format textual.

Serializarea binară

Să presupunem că există clasa Car, a cărei instanţă dorim să o


serializăm:

public class Car {


public int id;
public String model;
public double maximumSpeed;

@Override
public String toString() { return this.id + " " + this.model + " " + this.maximumSpeed; }
}

Instanţierea şi serializarea câmpurilor acestei clase ar arăta aşa:

import java.io.*;
public class Main {
public static void main(String[] args) throws FileNotFoundException, IOException {
Car c = new Car();
c.id=10;
c.model="Audi A8";

© Copyright Link group 1/8


Curs: Core Java Programming
Module: Gestionarea sistemului de fișiere
Unitate: Serializarea

c.maximumSpeed=270.00;
FileOutputStream fos = new FileOutputStream("MyCar");
ObjectOutputStream ob = new ObjectOutputStream(fos);
ob.writeObject(c.id);
ob.writeObject(c.model);
ob.writeObject(c.maximumSpeed);
ob.flush();
}
}

Dacă ne uităm la folderul aplicaţiei, vom vedea că în el se află fişierul


MyCar, cu conţinut binar. Pentru a descărca datele din acest fişier şi
pentru a le deserializa, folosim clasa ObjectInputStream.

FileInputStream fis = new FileInputStream("MyCar");


ObjectInputStream objIn = new ObjectInputStream(fis);
Car c = new Car();
c.id = Integer.parseInt(objIn.readObject().toString());
c.model = (String)objIn.readObject();
c.maximumSpeed =
Double.parseDouble(objIn.readObject().toString());
System.out.println(c);

Dacă totul este în regulă, rezultatul codului de mai sus va fi:

10 Audi A8 270.0

Dejavantajul evident al acestui exemplu este că în fișier salvăm doar


tipurile primitive, deşi ele fac parte din obiect. Putem face toate
acestea într-un mod mai simplu. Pe de altă parte, serializarea şi-ar
dovedi adevărata utilitate abia după salvarea obiectului complet.
Pentru ca acest lucru să funcţioneze, trebuie, pur şi simplu, să
implementăm interfaţa Serializable în clasa pe care dorim să o
serializăm. De exemplu:

import java.io.Serializable;

© Copyright Link group 2/8


Curs: Core Java Programming
Module: Gestionarea sistemului de fișiere
Unitate: Serializarea

public class Car implements Serializable {


public int id;
public String model;
public double maximumSpeed;

@Override
public String toString() { return this.id + " " + this.model + " " + this.maximumSpeed; }
}

După această intervenţie, în loc de câmpuri individuale, putem expedia


în flux un obiectul întreg:

public static void main(String[] args) throws IOException {


Car c = new Car();
c.id=10;
c.model="Audi A8";
c.maximumSpeed=270.00;

FileOutputStream fos = new FileOutputStream("MyCar");


ObjectOutputStream s = new ObjectOutputStream(fos);
s.writeObject(c);
s.flush();
}

Și să-l citim oricând dorim:

public static void main(String[] args) throws IOException, ClassNotFoundException {


FileInputStream fis = new FileInputStream("MyCar");
ObjectInputStream objIn = new ObjectInputStream(fis);
Car c = (Car)objIn.readObject();
System.out.println(c);
}

© Copyright Link group 3/8


Curs: Core Java Programming
Module: Gestionarea sistemului de fișiere
Unitate: Serializarea

Serializarea textuală – XML

Spre deosebire de serializarea binară, serializarea obiectelor în


XML este foarte populară. Unul dintre motive este că XML este un
format textual standardizat, care se transportă şi se deserializează
foarte simplu. Pentru a permite obiectului să fie serializat în XML, este
necesar să atribuim câmpurilor sale metodele adecvate Set şi Get.
După o astfel de intervenţie, clasa Car ar arăta aşa:

public class Car {


private int id;
private String model;
private double maximumSpeed;

public void setId(int id) { this.id = id; }


public int getId() { return this.id; }
public void setModel(String model) { this.model = model; }
public String getModel() { return this.model; }
public void setMaximumSpeed(double maximumSpeed) { this.maximumSpeed = maximum
Speed; }
public double getMaximumSpeed() { return this.maximumSpeed; }

@Override
public String toString() { return this.id + " " + this.model + " " + this.maximumSpeed; }
}

În afară de metodele necesare Set şi Get, observăm că pentru acest tip


de serializare nu este necesară implementarea interfeţei Serializable.

Pentru a face serializarea unui astfel de obiect în XML, folosim clasa


XMLEncoder, care se află în pachetul java.beans.

import java.beans.XMLEncoder;
import java.io.*;
public class Main {
public static void main(String[] args) throws FileNotFoundException, IOException {

© Copyright Link group 4/8


Curs: Core Java Programming
Module: Gestionarea sistemului de fișiere
Unitate: Serializarea

Car c = new Car();


c.setId(10);
c.setModel("Audi A8");
c.setMaximumSpeed(270.00);
FileOutputStream fos = new FileOutputStream("MyCar");
XMLEncoder s = new XMLEncoder(fos);
s.writeObject(c);
s.flush();
}
}

Acest exemplu va produce un fişier cu următorul conţinut:

<?xml version="1.0" encoding="UTF-8"?>


<java version="1.6.0_20" class="java.beans.XMLDecoder">
<object class="Car">
<void property="id">
<int>10</int>
</void>
<void property="maximumSpeed">
<double>270.0</double>
</void>
<void property="model">
<string>Audi A8</string>
</void>
</object>

Pentru a-l reconverti înapoi în obiect, putem să folosim următoarea


abordare:

FileInputStream fis = new FileInputStream("MyCar");


XMLDecoder objIn = new XMLDecoder(fis);
Car c = (Car)objIn.readObject();
System.out.println(c);

© Copyright Link group 5/8


Curs: Core Java Programming
Module: Gestionarea sistemului de fișiere
Unitate: Serializarea

Exerciții

Exercițiul 1

Este dată clasa User:

public class User {


private int id;
private String email;
private String password;

public void setId(int id){ this.id = id; };


public int getId() { return this.id; }
public void setEmail(String email){ this.email = email; };
public String getEmail() { return this.email; }
public void setPassword(String password){ this.password = password; };
public String getPassword() { return this.password; }

@Override
public String toString()
{
return this.id + " " + this.email + " " + this.password;
}
}

Trebuie să creăm metode adiţionale în această clasă: o metodă pentru


serializarea XML a obiectului şi a doua metodă, care este statică,
pentru crearea obiectului din documentul XML.

Testaţi serializarea şi deserializarea în metoda main().

Soluție:

Clasa User:

import java.beans.XMLDecoder;

© Copyright Link group 6/8


Curs: Core Java Programming
Module: Gestionarea sistemului de fișiere
Unitate: Serializarea

import java.beans.XMLEncoder;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

public class User {


private int id;
private String email;
private String password;

public void setId(int id){ this.id = id; };


public int getId() { return this.id; }
public void setEmail(String email){ this.email = email; };
public String getEmail() { return this.email; }
public void setPassword(String password){ this.password = password; };
public String getPassword() { return this.password; }

@Override
public String toString()
{
return this.id + " " + this.email + " " + this.password;
}

public void serializeXml(String xmlFile) throws FileNotFoundException


{
FileOutputStream fos = new FileOutputStream(xmlFile);
XMLEncoder s = new XMLEncoder(fos);
s.writeObject(this);
s.close();
}

public static User deserializeXml(String file) throws FileNotFoundException


{
FileInputStream fis = new FileInputStream(file);
XMLDecoder objIn = new XMLDecoder(fis);
User u = (User)objIn.readObject();
return u;
}

© Copyright Link group 7/8


Curs: Core Java Programming
Module: Gestionarea sistemului de fișiere
Unitate: Serializarea

Testarea serializării:

...
User u = new User();
u.setId(5);
u.setEmail("mail@mail.ml");
u.setPassword("123");
u.serializeXml("myXml.xml");
...

Testarea deserializării:

...
User u = User.deserializeXml("myXml.xml");
System.out.println(u);
...

© Copyright Link group 8/8

Powered by TCPDF (www.tcpdf.org)

S-ar putea să vă placă și