JAVA关键字集锦:
transient:
首先,介绍下序列化及反序列化:序列化(Serialization)是将对象的状态信息转化为可以存储或者传输的形式的过程,一般将一个对象存储到一个储存媒介,例如档案或记忆体缓冲等,在网络传输过程中,可以是字节或者XML等格式;而字节或者XML格式的可以还原成完全相等的对象,这个相反的过程又称为反序列化;
对象序列化机制(object serialization)是java语言内建的一种对象持久化方式,通过对象序列化,可以将对象的状态信息保存为字节数组,并且可以在有需要的时候将这个字节数组通过反序列化的方式转换成对象,对象的序列化可以很容易的在JVM中的活动对象和字节数组(流)之间进行转换。
比如:dubbo传输的对象,必须序列化;
如果生产者返回给消费者的对象中有未实现Serializable接口(进行序列化)的,都会报出如下错误:
Serialized class com.yykj.mall.dto.ProductListItemDTO must implement java.io.Serializable
Java类通过实现java.io.Serialization接口来启用序列化功能;
Transient 关键字的作用是控制变量的序列化,在变量声明前加上该关键字,可以阻止该变量被序列化到文件中,在被反序列化后,transient 变量的值被设为初始值,如 int 型的是 0,对象型的是 null。默认情况下,对象所有的变量都会转变成持久状态。但是有时候,一些变量可能不需要序列化,因为没必要对这些变量进行序列化。这时,你就可以将这些变量申明为 transient。如果一个变量被申明为 transient,那么这个变量就不会被序列化。
通过下面这个例子应该能够解释 transient 关键字的作用:
public class NameStore implements Serializable {
private String firstName;
private transient String middleName;
private String lastName;
public NameStore (String fName, String mName, String lName){
this.firstName = fName;
this.middleName = mName;
this.lastName = lName;
}
@Override
public String toString() {
return "NameStore{" +
"firstName='" + firstName + '\'' +
", middleName='" + middleName + '\'' +
", lastName='" + lastName + '\'' +
'}';
}
}
public class TransientExample {
public static void main(String[] args) throws Exception {
NameStore nameStore = new NameStore("Steve", "Middle","Jobs");
ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream("nameStore"));
// writing to object
o.writeObject(nameStore);
o.close();
// reading from object
ObjectInputStream in = new ObjectInputStream(new FileInputStream("nameStore"));
NameStore nameStore1 = (NameStore)in.readObject();
System.out.println(nameStore1);
}
}
例子输出:
NameStore{firstName='Steve', middleName='null', lastName='Jobs'}