Рубрики
Без рубрики

Ключевое слово transient в Java

Узнайте о ключевом слове transient и посмотрите на его поведение на примерах

Автор оригинала: baeldung.

1. введение

В этой статье мы сначала разберемся с ключевым словом transient , а затем рассмотрим его поведение на примерах.

2. Использование переходных

Давайте сначала разберемся в сериализации, прежде чем переходить к transient , как она используется в контексте сериализации.

Сериализация – это процесс преобразования объекта в поток байтов, а десериализация является его противоположностью|/.

Когда мы помечаем любую переменную как переходную, , то эта переменная не сериализуется . Поэтому процесс сериализации игнорирует исходное значение переменных и сохраняет значения по умолчанию для этого типа данных.

Ключевое слово 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());

Здесь мы видим, что Имя книги сохранено должным образом. С другой стороны, поле копирует имеет значение 0 и описание равно null – значения по умолчанию для соответствующих типов данных – вместо исходных значений.

4. Поведение С окончательным

Теперь давайте рассмотрим особый случай, когда мы будем использовать transient с ключевым словом final . Для этого сначала мы добавим конечный переходный элемент в наш Book класс, а затем создадим пустой Book объект:

public class Book implements Serializable {
    // existing fields    
    
    private final transient String bookCategory = "Fiction";

    // getters and setters
}
Book book = new Book();

Когда мы проверим значения после десериализации, мы заметим, что переходный был проигнорирован для этого поля, а исходное значение было сохранено :

assertEquals("Fiction", book.getBookCategory());

5. Заключение

В этой статье мы рассмотрели использование ключевого слова transient и его поведение при сериализации и десериализации. Мы также видели его другое поведение с ключевым словом final .

Как всегда, весь код доступен на GitHub .