第一次接触到transient这个关键字,它的意思是瞬时的,从翻译过来的字面意思上就不难明白,用这个关键字的属性的值只是瞬时的,不是永久的,
transient一般用的最多的就是在java 类序列化的时候,
如果类中某一属性加上了transient这一关键字,那么这个属性在序列化时,只是瞬时的,当再被反序列化回来的时候,它的值就不在了,
这也是出于某种安全上面的设计。
当时查这个关键字的时候,在csdn上有看到一篇文章,作者也有写例子,
但是我用作者那种方式写的时候,程序是报错的,错误如下:
java.io.StreamCorruptedException: invalid stream header: 3173756E
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:783)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:280)
at com.sunny.url.SerializableTest.main(SerializableTest.java:71)
是为什么呢,因为我写入文件的流与读出的流不一样,
下面就贴出我测试通过的代码:
package com.sunny.url;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
/**
* 序列化与序列化测试
* @author Sunny
* @date 2015-11-1下午11:33:14
* @anotion 这是……
*/
public class SerializableTest2 {
public static void main(String[] args) {
Sunny sunny = new Sunny("Sunny","999999");
System.out.println("序列化之前: ");
System.out.println("username: " + sunny.username);
System.err.println("password: " + sunny.passwd);
try {
ObjectOutputStream os = new ObjectOutputStream(
new FileOutputStream("C:\\Documents and Settings\\Administrator\\桌面\\sunny.txt"));
os.writeObject(sunny);
os.flush();
os.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
ObjectInputStream is = new ObjectInputStream(new FileInputStream(
"C:\\Documents and Settings\\Administrator\\桌面\\sunny.txt"));
sunny = (Sunny) is.readObject();
is.close();
System.out.println("\n序列化之后: ");
System.out.println("username: " + sunny.username);
System.err.println("password: " + sunny.passwd);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
class Sunny implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
protected String username;
protected transient String passwd;
protected Sunny(String userName,String pwd){
this.username = userName;
this.passwd = pwd;
}
}
控制台输出结果如下:
序列化之前:
username: Sunny
password: 999999
序列化之后:
username: Sunny
password: null
就这些,做个备忘。继续加油学习。