1. Introducere
În acest articol, vom înțelege mai întâi cuvântul cheie tranzitoriu și apoi vom vedea comportamentul acestuia prin exemple.
2. Utilizarea tranzitorilor
Să înțelegem mai întâi serializarea înainte de a trece la tranzitorii , deoarece este utilizată în contextul serializării.
Serializarea este procesul de conversie a unui obiect într-un flux de octeți, iar deserializarea este opusul acestuia .
Când marchăm orice variabilă ca tranzitorie, atunci acea variabilă nu este serializată . Prin urmare, procesul de serializare ignoră valoarea inițială a variabilelor și salvează valorile implicite pentru acel tip de date.
Cuvântul cheie tranzitoriu este util în câteva scenarii:
- Îl putem folosi pentru câmpuri derivate
- Este util pentru câmpurile care nu reprezintă starea obiectului
- Îl folosim pentru orice referințe neserializabile
3. Exemplu
Pentru a o vedea în acțiune, să creăm mai întâi o clasă de carte al cărei obiect am dori să-l serializăm:
public class Book implements Serializable { private static final long serialVersionUID = -2936687026040726549L; private String bookName; private transient String description; private transient int copies; // getters and setters }
Aici, am marcat descrierea și copiile ca câmpuri tranzitorii .
După crearea clasei, vom crea un obiect al acestei clase:
Book book = new Book(); book.setBookName("Java Reference"); book.setDescription("will not be saved"); book.setCopies(25);
Acum, vom serializa obiectul într-un fișier:
public static void serialize(Book book) throws Exception { FileOutputStream file = new FileOutputStream(fileName); ObjectOutputStream out = new ObjectOutputStream(file); out.writeObject(book); out.close(); file.close(); }
Să deserializăm obiectul acum din fișier:
public static Book deserialize() throws Exception { FileInputStream file = new FileInputStream(fileName); ObjectInputStream in = new ObjectInputStream(file); Book book = (Book) in.readObject(); in.close(); file.close(); return book; }
În cele din urmă, vom verifica valorile obiectului de carte :
assertEquals("Java Reference", book.getBookName()); assertNull(book.getDescription()); assertEquals(0, book.getCopies());
Aici vedem că bookName a fost persistat în mod corespunzător. Pe de altă parte, câmpul de copii are valoarea 0 și descrierea este nulă - valorile implicite pentru tipurile lor de date respective - în locul valorilor originale.
4. Comportament cu final
Acum, să vedem un caz special în care vom folosi tranzitoriu cu cuvântul cheie final . Pentru aceasta, mai întâi, vom adăuga un ultim element tranzitoriu în clasa noastră de carte și apoi vom crea un obiect de carte gol :
public class Book implements Serializable { // existing fields private final transient String bookCategory = "Fiction"; // getters and setters }
Book book = new Book();
Când verificăm valorile după deserializare, vom observa că tranzitorul a fost ignorat pentru acest câmp și valoarea inițială a fost persistată :
assertEquals("Fiction", book.getBookCategory());
5. Concluzie
În acest articol, am văzut utilizarea cuvântului cheie tranzitoriu și comportamentul acestuia în serializare și deserializare. De asemenea, am văzut comportamentul său diferit cu cuvântul cheie final .
Ca întotdeauna, tot codul este disponibil pe GitHub.