1. Введение
В этой статье мы сначала разберемся с ключевым словом transient
, а затем рассмотрим его поведение на примерах.
2. Использование переходного процесса
Давайте сначала разберемся с сериализацией, прежде чем перейти к переходу, поскольку
он используется в контексте сериализации.
Сериализация — это процесс преобразования объекта в поток байтов, а десериализация — противоположность ему .
Когда мы помечаем любую переменную как переходную,
эта переменная не сериализуется . Поскольку переходные
поля отсутствуют в сериализованной форме объекта, процесс десериализации будет использовать значения по умолчанию для таких полей при создании объекта из сериализованной формы.
Ключевое слово transient
полезно в нескольких сценариях:
- Мы можем использовать его для производных полей
- Это полезно для полей, которые не представляют состояние объекта.
- Мы используем его для любых несериализуемых ссылок
3. Пример
Чтобы увидеть это в действии, давайте сначала создадим класс Book
, объект которого мы хотели бы сериализовать:
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
}
Здесь мы пометили описание
и копии
как временные
поля.
После создания класса мы создадим объект этого класса:
Book book = new Book();
book.setBookName("Java Reference");
book.setDescription("will not be saved");
book.setCopies(25);
Теперь мы сериализуем объект в файл:
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();
}
Теперь давайте десериализуем объект из файла:
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;
}
Наконец, мы проверим значения объекта book
:
assertEquals("Java Reference", book.getBookName());
assertNull(book.getDescription());
assertEquals(0, book.getCopies());
Здесь мы видим, что bookName
правильно сохранен. С другой стороны, поле копий
имеет значение 0
, а описание
равно null —
значения по умолчанию для соответствующих типов данных — вместо исходных значений.
4. Поведение с финалом
Теперь давайте рассмотрим случай, когда мы будем использовать переходный процесс
с ключевым словом final
. Для этого сначала мы добавим последний переходный
элемент в наш класс Book
, а затем создадим пустой объект Book :
public class Book implements Serializable {
// existing fields
private final transient String bookCategory = "Fiction";
// getters and setters
}
Book book = new Book();
Модификатор final не имеет значения — поскольку поле является переходным
, для этого поля не сохраняется никакое значение. Во время десериализации новый объект Book получает значение по умолчанию
Fiction
, определенное в классе Book
, но это значение не берется из данных сериализации:
assertEquals("Fiction", book.getBookCategory());
5. Вывод
В этой статье мы увидели использование ключевого слова transient
и его поведение при сериализации и десериализации.
Как всегда, весь код доступен на GitHub .