java序列化注意点

1.显示申明serialVersionUID可以避免对象不一致。因为在jvm反序列化时,会比较数据流中的serialVersionUID与类的    serialVersionUID是否相同,若相同则认为类没有发生变化,可以把数据流load为实例对象;若不同,则抛异常  InnalidClassException.
 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);
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值