关于 transient的总结

最经的项目中有用到序列化和反序列化的东西,可以对于有些字段的反序列化总是得不到想要的值,折磨了好久,后来一个同事提醒了我,是关于transient的问题,所以特别写了个小例子来描述这个关键字在序列化中的应用

package com.eric.transienttest;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class TransientTest {
public static void main(String[] args) {
Person p1 = new Person("Eric", "123456");
Person2 p2 = new Person2("Simon", "123456");

readAndWriteObject(p1);
readAndWriteObject(p2);

//由于people2的pwd字段被设置了transient 所以其打印的结果如下

//before write file:person1 name:Eric pwd:123456
//get object from file:person1 name:Eric pwd:123456
//before write file:person2 name:Simon pwd:123456
//get object from file:person2 name:Simon pwd:null

}

static void readAndWriteObject(People people) {

System.out.println("before write file:" + people);
try {
ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream("people.out"));
o.writeObject(people);
o.close();
} catch (Exception e) {
e.printStackTrace();
}

// To read the object back, we can write

try {
ObjectInputStream in = new ObjectInputStream(new FileInputStream("people.out"));
People people2 = (People) in.readObject();
System.out.println("get object from file:" + people2);
} catch (Exception e) {// deal with exception}

}
}
}

class People {

}

class Person extends People implements Serializable {
/**
*
*/
private static final longserialVersionUID= -9221500999229526064L;
private String name;
private String pwd;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getPwd() {
return pwd;
}

public void setPwd(String pwd) {
this.pwd = pwd;
}

public Person(String name, String pwd) {
super();
this.name = name;
this.pwd = pwd;
}

@Override
public String toString() {
return "person1 name:" + name + " pwd:" + pwd;
}

}

class Person2 extends People implements Serializable {
/**
*
*/
private static final longserialVersionUID= -3195698226754948666L;
private String name;
private transient Stringpwd; // 这个不会被序列化和反序列化

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getPwd() {
return pwd;
}

public void setPwd(String pwd) {
this.pwd = pwd;
}

public Person2(String name, String pwd) {
super();
this.name = name;
this.pwd = pwd;
}

@Override
public String toString() {
return "person2 name:" + name + " pwd:" + pwd;
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值