Java中的transient關鍵字
瀏覽人數:1,051最近更新:
- 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
}
在這裡,我們已將description
和copies
標記為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
字段的值為0
, description
為null –
它們各自數據類型的默認值),而不是原始值。
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
關鍵字不同的行為。
本作品係原創或者翻譯,採用《署名-非商業性使用-禁止演繹4.0國際》許可協議