十二、JavaIO之(对象序列化)

空扰寡人 提交于 2020-01-13 07:33:20

一、序列化简介

对象序列化的核心意义在于将内存中的对象转换为二进制数据流的形式进行处理。
所有的对象都是在堆内存空间保存的,并且每一块堆内存空间所保存的全部都是对象拥有的属性内容,但是在很多情况下有可能需要将一个对象直接进行远程传输或者是进行文件的保存。
在这里插入图片描述
但是需要注意的是,并非所有的类对象都可以被序列化,在Java里面可以被序列化对象所在的类一定要实现java.io.Serializable接口。但是这个接口里面并没有任何的方法,所以与Cloneable接口样,都属于一个标记接口,用于表示-种处理的能力。
**例:**定义序列化类

class Ball implements Serializable{  
    private String name;
    private double price;

    public Ball(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public Ball() {
    }

    public String getName() {
        return name;
    }

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

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }
}

在所有序列化对象里面实际上会存在有-一个序列化编号的概念。

class Ball implements Serializable {
private long serialVersionUID = 1L
};

此时定义的“serialVersionUID”描述的就是一个序列化版本的编号,但是这个标记是否添加的意义并不大,但是从Java的官方来讲,如果你没有定义这样的序列化版本标记,那么系统在编译的时候也会帮助用户生成一个唯一的序列化标记。

二、序列化与反序列化

在Java之中序列化本身是有自己的标准格式的,只有按照标准格式定义的操作才可以得到通用的反序列化的操作支持,所以在用户进行序列化和反序列化实现的过程之中,最好使用java.io包中提供的两个类来完成:

【序列化1】ObjectOutputStream 【反序列化】ObjectInputStream
public class ObjectOutputStream extends OutputStream implements ObjectOutput, ObjectStreamConstants public class ObjectInputStream extends InputStream implements ObjectInput, ObjectStreamConstants
public ObjectOutputStream(OutputStream out) throws IOException public ObjectInputStream(InputStream in) throws IOException
public final void writeObject(Object obj) throws IOException public final Object readObject() throws IOException,ClassNotFoundException

在这里插入图片描述
只有通过ObjectInputStream.readObject()才可以读取ObjectOutputStream.writeObject()序列化的对象信息。

**例:**实现序列化与反序列化的处理

public class TestDemo {

    private static final File BALL_FILE = new File("D:" + File.separator + "ball.ser");

    public static void main(String[] args) throws Exception {
        serial();
        deserial();

    }

    public static void serial() throws Exception {
        Ball ball = new Ball("NIKE", 999);
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(BALL_FILE));
        oos.writeObject(ball); //序列化对象
        oos.close();


    }
    public static void deserial() throws Exception {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(BALL_FILE));
        Ball ball=(Ball) ois.readObject(); //反序列化对象
        System.out.println(ball);
        ois.close();


    }
}

程序执行结果:
在这里插入图片描述
name=NIKE price=999.0

此时实现的对象序列化操作实际上是Java自身的结构,这种结构不是公共的操作结构那么就意味着该对象只能够被一种语言所使用,所以在实际的项目里面为了能够让序列化的对象供所有的语言使用,往往会使用一些第三方的序列化管理工具类。

三、transient关键字

现在所使用的序列化属于自动序列化,那么在进行自动序列化的操作过程之中,实际上对象中所有的属性都会被默认进行保存,但是这个时候有些属性可能并不需要进行保存,所以在自动化管理的序列化操作之中,就可以针对于这些不需要保存的属性,使用transient来声明。

例:观察transient的作用

class Ball implements Serializable {
    private transient String name;
    private transient double price;
    }

serial();
deserial();

程序执行结果:
name=null price=0.0

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!