对象序列化时,如果对象里的属性也是个引用类型,则这个引用变量也必须实现序列化
否则不在序列化。
序列化时,它会先检查此对象是否序列化过,如果没有,则把对象写入流,并且编号。
当同一个对象再次序列时,写入的只是原来分配的编号,这样就保证原来是同一个对象的
读取出来后还是同一个对象。
这样的话,如把一个对象第一次写入后,再改变了对象的属性,然后再次序列化,因为再次
序列化只是写入编号,不会写入对象,所以原来的属性不会发生改变。
通过下面两个私有方法,可以实现自定义序列化,把想序列化的属性序列化,即使加了 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.