JAVA基础知识|Serializable

一、序列化和反序列化

序列化:把对象转换为字节序列的过程称为对象的序列化。

反序列化:把字节序列恢复为对象的过程称为对象的反序列化。

将内存中对象的信息保存下来,可以有很多种方式实现这一功能。其中java提供了一种更好的保存对象状态的机制,那就是序列化。

应用场景:

  • 把内存中的对象状态保存到一个文件或者数据库中的时候;
  • 在网络上传送对象的时候;
  • 其他(以后再补充)

二、实例

import java.io.Serializable;

/**
 * Created by jyy on 2018/6/4.
 */
public class Cat implements Serializable {

    public Cat(String id, String name) {
        this.id = id;
        this.name = name;
    }

    private String id;
    private String name;
    public static String call = "喵喵喵";

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Cat{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", call='" + call + '\'' +
                '}';
    }
}
import java.io.*;

/**
 * Created by jyy on 2018/4/19.
 */
public class Test {

    public static void main(String[] args){

        Cat cat = new Cat("1001","Tom");
        serialize(cat);
        deserialize();

        Cat.call = "喵";
        deserialize();
    }

    /**
     * 序列化
     */
    public static void serialize(Cat cat){

        ObjectOutputStream oos = null;
        try {
            oos = new ObjectOutputStream(new FileOutputStream(new File("D:/other/cat.txt")));
            oos.writeObject(cat);
            System.out.println("序列化成功:"+cat);
        }catch(IOException e){
            System.out.println("Cat 对象序列化失败!");
        }finally{
            try {
                oos.close();
            }catch(IOException e){
                System.out.println("输出流关闭失败!");
            }
        }
    }

    /**
     * 反序列化
     */
    public static void deserialize(){

        ObjectInputStream ois;
        try {
            ois = new ObjectInputStream(new FileInputStream(new File("D:/other/cat.txt")));
            Cat cat1 = (Cat)ois.readObject();
            System.out.println("反序列化成功:"+cat1);
        }catch (Exception e){
            System.out.println("Cat 对象反序列化失败!");
        }
    }
}

执行结果:

序列化成功:Cat{id='1001', name='Tom', call='喵喵喵'}
反序列化成功:Cat{id='1001', name='Tom', call='喵喵喵'}
反序列化成功:Cat{id='1001', name='Tom', call='喵'}

对象中非静态的成员变量“id”,“name”可以被序列化。但是静态成员变量“call”,不可以被序列化,因为它是属于类信息的一部分,而不属于对象。

如果某一成员变量不想被序列化,可以使用关键字“transient”进行修饰。

三、serialVersionUID

将序列化后的对象进行网络传输时,serialVersionUID将必不可少。

例如在客户端A中Cat类的serialVersionUID=1L,而在客户端B中Cat类的serialVersionUID=2L,那么就不能反序列化这个对象。

serialVersionUID有两种生成策略:

  • 一个是固定的 1L;
  • 一个是随机生成不重复的 long 类型数据(实际上是使用JDK工具根据类名、接口名、成员方法及属性等来生成);
posted @ 2018-06-04 19:58  无聊的三文鸡  阅读(211)  评论(0)    收藏  举报