Java序列化与反序列化

来源:互联网 发布:turn.js翻页触发动画 编辑:程序博客网 时间:2024/06/08 05:15

前言

1、静态变量无法序列化;

2、transient修饰的变量无法序列化

  有些时候我们不需要把对象的全部属性都序列化,就可以使用transient关键字。

3、序列化的好处

  序列化的好处包括可以持久化对象,将对象保存在本地磁盘,下次直接读取出来就可以使用;
  在远程传输的过程中,除了需要传输文字、图片等等,有时候需要传输对象,而传输对象就需要将其转化为字节,传输在网络上,接收端将其接收到以后再转为对象,而这个过程不需要我们自己实现,只要类实现了Serializable接口就行了,这是个标记接口,没有方法需要我们实现。

  下面通过代码来看序列化和反序列化,下面代码功能是将对象序列化存储在本地,然后再反序列化读取到对象。

package cn.zhoucy.serializable;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;class Person implements Serializable{    private static final long serialVersionUID = 1L;    private String name;    private int age;    private transient String nickName;    static byte count = 1;    public Person(){        super();    }    public Person(String name, int age,String nickName) {        super();        this.name = name;        this.age = age;        this.nickName = nickName;        count++;    }    public String getInfo(){        return this.name +" "+ this.age+" "+ this.nickName;    }}public class SerializableTest {    public static void main(String[] args) throws Exception {        File path = new File("E:/javaA/person");        path.createNewFile();        //先序列化保存到本地        Person p1 = new Person("peter", 12,"littleP");        FileOutputStream fos = new FileOutputStream(path);        ObjectOutputStream oos = new ObjectOutputStream(fos);        oos.writeObject(p1);        oos.close();        fos.close();        //Person.count = 10;        //开始读出来        FileInputStream fis = new FileInputStream(path);        ObjectInputStream ois = new ObjectInputStream(fis);        Person p2 = (Person)ois.readObject();        ois.close();        fis.close();        System.out.println(p2.getInfo());        System.out.println(p2.count);    }}

输出结果:
这里写图片描述

这里有两个点要注意:

1、最后一个nickName属性输出是null,是因为被transient 修饰,所以不会被序列化,故而读出来是null;

2、count属性是static修饰的,按理说是不会被序列化的,为什么这里又会输出2呢?是因为这个测试代码在同一台机器上同一个进程里面,static只保存一份,本地的进程中保存有count的量,所以可以读取出来,如果是远程通信就不会有这种情况了。总之这里输出的count=2并不是因为序列化保存了count属性。如果把注释掉的Person.count = 10;打开,那么控制台打印输出的就会是10。