您的位置:首页 > 编程语言 > Java开发

java transient关键字用法

2015-11-01 23:35 501 查看
第一次接触到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


就这些,做个备忘。继续加油学习。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: