java序列化和反序列化

示例代码如下:

public class Person implements Serializable {//实现Serializable接口,就可以被序列化和反序列化
   /***
    *类序列化版本号
    *如果类有变化,比如有个字段类型改了,就要改变这个值;
    *如果待反序列化的文件和类中的这个版本号不一致,就直接抛异常,提 
    *示不能反序列化到这个类型,认为类型不一致
    */
   private static final long serialVersionUID = 1111013L;
   //不需要序列化名字与年龄
   private transient String name;
   private transient int age;//transient修饰的字段,不参与序列化和反序列化
   private int height;
   private transient boolean singlehood;
   public Person(String name, int age) {
       this.name = name;
       this.age = age;
   }

   /*序列化自定义方法
    *我们可以定制序列化逻辑,哪些字段序列化,哪些不,哪些字段要修改 
    *后序列化等等
    *如果不定义这个方法,jvm会调用默认实现
    *一般都不定义这个方法
    */
   private void writeObject(ObjectOutputStream out) throws IOException {//将名字反转写入二进制流       
         out.writeObject(new StringBuffer(this.name).reverse()); 
         out.writeInt(age);   
   }
  /*自定义反序列法方法,和上一个方法是对应的 
   *一般不定义这个方法
   */
   private void readObject(ObjectInputStream ins) throws IOException,ClassNotFoundException{//将读出的字符串反转恢复回来
         this.name = ((StringBuffer)ins.readObject()).reverse().toString(); 
         this.age = ins.readInt();
   }
   
   /*writeObject方法被调用之前,会调用该方法,会把带序列化的对象替 
    *换掉,不知道有啥意义,可以不定义这个方法
    */
    private Object writeReplace() throws ObjectStreamException {
           ArrayList<Object> list = new ArrayList<>(2);
           list.add(this.name);
           list.add(this.age);
           return list;
    }

    /*readeObject方法被调用之后,会调用该方法,会把反序列化的对象 
     *丢弃,用这个方法返回的对象替换原对象,不知道有啥意义,可以不定 
     *义这个方法
     */
     private Object readResolve() throws ObjectStreamException{
           return new ("brady", 23);
     }

}

public class TransientTest {
   public static void main(String[] args) throws Exception {
       try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.txt"));//ObjectOutputStream 序列化流
            ObjectInputStream ios = new ObjectInputStream(new FileInputStream("person.txt"))) {//ObjectInputStream 反序列化流
           Person person = new Person("9龙", 23);
           person.setHeight(185);
           System.out.println(person);
           oos.writeObject(person);//序列化到磁盘文件 person.txt
           Person p1 = (Person)ios.readObject();//从磁盘文件person.txt 反序列化到内存对象
           System.out.println(p1);
       }
   }
}

 

   

posted @ 2022-02-23 15:55  高压锅里的大萝卜  阅读(38)  评论(0编辑  收藏  举报