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 [Link] + " " + [Link] + " " + [Link]; }
}
Instanţierea şi serializarea câmpurilor acestei clase ar arăta aşa:
import [Link].*;
public class Main {
public static void main(String[] args) throws FileNotFoundException, IOException {
Car c = new Car();
[Link]=10;
[Link]="Audi A8";
© Copyright Link group 1/8
Curs: Core Java Programming
Module: Gestionarea sistemului de fișiere
Unitate: Serializarea
[Link]=270.00;
FileOutputStream fos = new FileOutputStream("MyCar");
ObjectOutputStream ob = new ObjectOutputStream(fos);
[Link]([Link]);
[Link]([Link]);
[Link]([Link]);
[Link]();
}
}
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();
[Link] = [Link]([Link]().toString());
[Link] = (String)[Link]();
[Link] =
[Link]([Link]().toString());
[Link](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 [Link];
© 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 [Link] + " " + [Link] + " " + [Link]; }
}
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();
[Link]=10;
[Link]="Audi A8";
[Link]=270.00;
FileOutputStream fos = new FileOutputStream("MyCar");
ObjectOutputStream s = new ObjectOutputStream(fos);
[Link](c);
[Link]();
}
Ș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)[Link]();
[Link](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) { [Link] = id; }
public int getId() { return [Link]; }
public void setModel(String model) { [Link] = model; }
public String getModel() { return [Link]; }
public void setMaximumSpeed(double maximumSpeed) { [Link] = maximum
Speed; }
public double getMaximumSpeed() { return [Link]; }
@Override
public String toString() { return [Link] + " " + [Link] + " " + [Link]; }
}
Î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 [Link].
import [Link];
import [Link].*;
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();
[Link](10);
[Link]("Audi A8");
[Link](270.00);
FileOutputStream fos = new FileOutputStream("MyCar");
XMLEncoder s = new XMLEncoder(fos);
[Link](c);
[Link]();
}
}
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="[Link]">
<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)[Link]();
[Link](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){ [Link] = id; };
public int getId() { return [Link]; }
public void setEmail(String email){ [Link] = email; };
public String getEmail() { return [Link]; }
public void setPassword(String password){ [Link] = password; };
public String getPassword() { return [Link]; }
@Override
public String toString()
{
return [Link] + " " + [Link] + " " + [Link];
}
}
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 [Link];
© Copyright Link group 6/8
Curs: Core Java Programming
Module: Gestionarea sistemului de fișiere
Unitate: Serializarea
import [Link];
import [Link];
import [Link];
import [Link];
public class User {
private int id;
private String email;
private String password;
public void setId(int id){ [Link] = id; };
public int getId() { return [Link]; }
public void setEmail(String email){ [Link] = email; };
public String getEmail() { return [Link]; }
public void setPassword(String password){ [Link] = password; };
public String getPassword() { return [Link]; }
@Override
public String toString()
{
return [Link] + " " + [Link] + " " + [Link];
}
public void serializeXml(String xmlFile) throws FileNotFoundException
{
FileOutputStream fos = new FileOutputStream(xmlFile);
XMLEncoder s = new XMLEncoder(fos);
[Link](this);
[Link]();
}
public static User deserializeXml(String file) throws FileNotFoundException
{
FileInputStream fis = new FileInputStream(file);
XMLDecoder objIn = new XMLDecoder(fis);
User u = (User)[Link]();
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();
[Link](5);
[Link]("mail@[Link]");
[Link]("123");
[Link]("[Link]");
...
Testarea deserializării:
...
User u = [Link]("[Link]");
[Link](u);
...
© Copyright Link group 8/8
Powered by TCPDF ([Link])