Java中的transient關鍵字

1.簡介

在本文中,我們將首先理解transient關鍵字,然後通過示例查看其行為。

2. transient

首先讓我們了解序列化,然後再轉向transient因為它是在序列化的上下文中使用的。

序列化是將對象轉換為字節流的過程,而反序列化則與之相反

當我們將任何變量標記為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

 }

在這裡,我們已將descriptioncopies標記為transient字段。

創建類之後,我們將創建該類的對象:

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已正確保留。另一方面, copies字段的值為0descriptionnull –它們各自數據類型的默認值),而不是原始值。

4.行為與final

現在,讓我們看一個特殊的情況,我們將對final關鍵字transient為此,首先,我們在Book final transient元素,然後創建一個空的Book對象:

public class Book implements Serializable {

 // existing fields



 private final transient String bookCategory = "Fiction";



 // getters and setters

 }
Book book = new Book();

在反序列化後驗證值時,我們會發現**transient ,並且原始值得以保留**:

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

5.結論

在本文中,我們看到了transient關鍵字的用法及其在序列化和反序列化中的行為。我們也看到了與final關鍵字不同的行為。