Serializable序列化
代码
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.Serializable;
public class User implements Serializable {
transient private String userName;
static private String sex;
private Integer userId;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public static void setSex(String sex) {
User.sex = sex;
}
@Override
public String toString() {
return "User{" +
"userName='" + userName + '\'' +
", sex='" + sex + '\'' +
", userId=" + userId +
'}';
}
private void readObject(ObjectInputStream objectInputStream) throws IOException, ClassNotFoundException {
objectInputStream.defaultReadObject();
if (userId <= 0) {
throw new IllegalArgumentException("userId非法");
}
}
}
测试
输入:User{userName=‘LiSi’, sex=‘02’, userId=1}
输出:User{userName=‘null’, sex=‘02’, userId=1}
public static void main(String[] args) throws IOException, ClassNotFoundException {
User user = new User();
user.setUserId(1);
user.setUserName("LiSi");
User.setSex("02");
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("F:\\Download\\user.text"));
objectOutputStream.writeObject(user);
objectOutputStream.flush();
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("F:\\Download\\user.text"));
// objectInputStream.readObject()会反射调用User的readObject方法
Object object = objectInputStream.readObject();
User user2 = (User) object;
System.out.println(user2.toString());
}
总结
1.transient修饰的非static不会被序列化
2.static类变量不参与序列化,序列化只针对实例对象
3.变量sex为static变量,值一直是"02"
4.objectInputStream.readObject()会反射调用User的readObject方法
5.单例对象要保证和反序列化对象相等,需要添加readResolve方法返回单例对象
附录
单例对象的反序列化
public class MySingleton implements Serializable {
public static MySingleton getSingleInstance() {
return SingletonHolder.instance;
}
static class SingletonHolder {
private static MySingleton instance = new MySingleton();
}
}
测试1
instance1 == instance2 : false
MySingleton instance1 = MySingleton.getSingleInstance();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("F:\\Download\\singleton.text"));
objectOutputStream.writeObject(instance1);
objectOutputStream.flush();
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("F:\\Download\\singleton.text"));
Object object = objectInputStream.readObject();
MySingleton instance2 = (MySingleton) object;
System.out.println("instance1 == instance2 : "+ (instance1 == instance2));
在MySingleton中加入方法readResolve
public class MySingleton implements Serializable {
public static MySingleton getSingleInstance() {
return SingletonHolder.instance;
}
static class SingletonHolder {
private static MySingleton instance = new MySingleton();
}
// 加入方法readResolve
private Object readResolve() {
return getSingleInstance();
}
}
测试2
instance1 == instance2 : true