java序列化





  对象序列化时,如果对象里的属性也是个引用类型,则这个引用变量也必须实现序列化
否则不在序列化。
  序列化时,它会先检查此对象是否序列化过,如果没有,则把对象写入流,并且编号。
当同一个对象再次序列时,写入的只是原来分配的编号,这样就保证原来是同一个对象的
读取出来后还是同一个对象。
   这样的话,如把一个对象第一次写入后,再改变了对象的属性,然后再次序列化,因为再次
序列化只是写入编号,不会写入对象,所以原来的属性不会发生改变。

通过下面两个私有方法,可以实现自定义序列化,把想序列化的属性序列化,即使加了 transient
但是写和读属性的顺序得一致,不然会出现属性值混乱。

public class person implements Serializable{
 
 

 private   String id,name;
   
 public int j;
 
 public  transient String sex="boy";
 
 
   private void writeObject(ObjectOutputStream outputStream) throws IOException{
   
    outputStream.writeObject(name);

    outputStream.writeObject(id);
   
   
   
    outputStream.writeObject(sex);
   
   
   
   
   
   }
 
private void readObject(ObjectInputStream inputStream) throws IOException, ClassNotFoundException{
 
 this.id=inputStream.readObject().toString();
 
 this.name=inputStream.readObject().toString();
 
this.sex=inputStream.readObject().toString();
 
}
   
 
}


自定义序列化2
 
   去掉上面两个方法,在添加一个writeReplace(),这个方法可以返回另一个对象
当读取序列化对象时,返回的就是这个方法返回的对象。这个方法会在writeObject()之前触发。

public class person implements Serializable{
 
 
 

 private   String id,name;
   
 public int j;
 
 public  transient String sex="boy";
 
 private Object writeReplace()throws ObjectStreamException{
 
  ArrayList<String> list=new ArrayList<String>();
 
  list.add(id);
  list.add(name);
  list.add(sex);
 
  return list;
 
   
 }
 
 
}



  系统升级后,如果原来的类发生了改变(属性增加或者减少了,方法变了),这样再把这个对象从文件中
反序列化出来,可能就不兼容了。
   这时可以为这个类指定一个
     private static final long serialVersionUID=7899;

这样就可以兼容了。

修改了类方法,静态修饰词不受影响。
如果新类中比序列化对象中属性值减少了,则多余的属性抛弃
如果新类中属性变多了,引用变量赋值null,基本变量0.














当使用处理流来进行io操作时,只需关闭最上层的io流即可。

  对象序列化时,如果对象里的属性也是个引用类型,则这个引用变量也必须实现序列化
否则不在序列化。
  序列化时,它会先检查此对象是否序列化过,如果没有,则把对象写入流,并且编号。
当同一个对象再次序列时,写入的只是原来分配的编号,这样就保证原来是同一个对象的
读取出来后还是同一个对象。
   这样的话,如把一个对象第一次写入后,再改变了对象的属性,然后再次序列化,因为再次
序列化只是写入编号,不会写入对象,所以原来的属性不会发生改变。

通过下面两个私有方法,可以实现自定义序列化,把想序列化的属性序列化,即使加了 transient
但是写和读属性的顺序得一致,不然会出现属性值混乱。

public class person implements Serializable{
 
 
 

 private   String id,name;
   
 public int j;
 
 public  transient String sex="boy";
 
 
   private void writeObject(ObjectOutputStream outputStream) throws IOException{
   
    outputStream.writeObject(name);

    outputStream.writeObject(id);
   
   
   
    outputStream.writeObject(sex);
   
   
   
   
   
   }
 
private void readObject(ObjectInputStream inputStream) throws IOException, ClassNotFoundException{
 
 this.id=inputStream.readObject().toString();
 
 this.name=inputStream.readObject().toString();
 
this.sex=inputStream.readObject().toString();
 
}
   
 
}


自定义序列化2
 
   去掉上面两个方法,在添加一个writeReplace(),这个方法可以返回另一个对象
当读取序列化对象时,返回的就是这个方法返回的对象。这个方法会在writeObject()之前触发。

public class person implements Serializable{
 
 
 

 private   String id,name;
   
 public int j;
 
 public  transient String sex="boy";
 
 private Object writeReplace()throws ObjectStreamException{
 
  ArrayList<String> list=new ArrayList<String>();
 
  list.add(id);
  list.add(name);
  list.add(sex);
 
  return list;
 
   
 }
 
 
}



  系统升级后,如果原来的类发生了改变(属性增加或者减少了,方法变了),这样再把这个对象从文件中
反序列化出来,可能就不兼容了。
   这时可以为这个类指定一个
     private static final long serialVersionUID=7899;

这样就可以兼容了。

修改了类方法,静态修饰词不受影响。
如果新类中比序列化对象中属性值减少了,则多余的属性抛弃
如果新类中属性变多了,引用变量赋值null,基本变量0.













  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值