2.避免用序列化类在构造函数中为final变量赋值。反序列化时final变量在以下情况不会重新赋值。
1.通过构造函数为其赋值(反序列化时不会执行构造函数)
2.通过方法返回值为其赋值
3.final修饰的属性不是基本类型。(基本类型包括:8种基本类型,数组,未使用new生成的字符串)
注:对象流不序列化static或transient属性。
4.自定义序列化,只需在被序列化的字段里添加writeObject及readObject方法即可,例如:
public class User implements Serializable{
private static final long serialVersionUID = 1L;
private String name="YY";
private String age="123";
public User(){
System.out.println("+++++++");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
private final String id=new String("222");
public String getId() {
return id;
}
//自定义要序列化的字段
private void writeObject( ObjectOutputStream oos) throws IOException{
oos.defaultWriteObject();
oos.writeBytes(this.getName());
oos.writeInt(Integer.parseInt(this.getId()));
}
//自定义读取序列化的字段
private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException{
ois.defaultReadObject();
System.out.println(ois.readByte());
System.out.println(ois.readInt());
}
private static String filePath = "E:/Program/MyTest/files/serial.txt";
public static File getFile(){
return new File(filePath);
}
}