This is an old revision of the document!


Laboratorul 12: Programare Avansată Java

Obiective

Serializare și Deserializare

Ce este serializarea?

Serializarea reprezintă procesul prin care un obiect Java este transformat într-o secvență de bytes, astfel încât să poată fi:

  • salvat pe disc
  • transmis prin rețea
  • stocat temporar (cache)
  • restaurat ulterior în memorie

Operația inversă se numește deserializare.

De ce avem nevoie de serializare?

Serializarea este folosită în special pentru:

  • salvarea stării unei aplicații
  • persistarea temporară a obiectelor
  • transfer de date între procese sau servicii
  • sisteme de cache distribuit
  • mecanisme de rollback / snapshot

Serializarea NU este o soluție generală de persistare, adică nu înlocuiește o bază de date.

Interfața Serializable

Pentru ca un obiect să poată fi serializat, clasa sa trebuie să implementeze interfața java.io.Serializable.

public class User implements Serializable {
    private String name;
    private int age;
}

  • Serializable este un marker interface, nu definește metode și JVM verifică la runtime prezența lui.
  • Excepția asociată cu această interfață este NotSerializableException.

Exemplu complet: serializare și deserializare

1. Clasa model

import java.io.Serializable;
 
public class Person implements Serializable {
    private String name;
    private int age;
 
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
 
    @Override
    public String toString() {
        return name + " (" + age + ")";
    }
}

2. Serializarea unui obiect

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
 
public class SerializeDemo {
    public static void main(String[] args) throws Exception {
        Person p = new Person("Ana", 30);
 
        ObjectOutputStream out =
            new ObjectOutputStream(new FileOutputStream("person.ser"));
 
        out.writeObject(p);
        out.close();
 
        System.out.println("Object serialized.");
    }
}

3. Deserializarea unui obiect

import java.io.FileInputStream;
import java.io.ObjectInputStream;
 
public class DeserializeDemo {
    public static void main(String[] args) throws Exception {
        ObjectInputStream in =
            new ObjectInputStream(new FileInputStream("person.ser"));
 
        Person p = (Person) in.readObject();
        in.close();
 
        System.out.println("Deserialized: " + p);
    }
}

Output

Output

Object serialized.
Deserialized: Ana (30)

Câmpuri transient

Unele câmpuri NU trebuie serializate:

  • parole
  • token-uri
  • conexiuni
  • cache-uri

Pentru acestea folosim proprietatea transient.

public class Account implements Serializable {
    private String username;
    private transient String password;
}

Deoarece am declarat password ca fiind transient, acesta nu este salvat, iar după deserializare devine null.

Versionarea serializării

Câmpul serialVersionUID identifică versiunea clasei serializate.

private static final long serialVersionUID = 1L;

De ce este necesar?

  • JVM verifică compatibilitatea clasei la deserializare.
  • modificările structurale pot rupe compatibilitatea.

Fără UID explicit:

  • JVM generează unul automat.
  • orice mică modificare va genera un nou UID.

poo-ca-cd/laboratoare/programare-avansata-java.1768153596.txt.gz · Last modified: 2026/01/11 19:46 by florian_luis.micu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0