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
关键字不同的行为。
0 评论