Fork me on GitHub

序列化/反序列化

注意:所有文章除特别说明外,转载请注明出处.

[TOC]

序列化/反序列化

所有要实现序列化的类都必须要实现Serializable接口(位于java.lang包中)。如果一个类能够被序列化,那么它的子类也能够被序列化。由于static代表类的成员,transient(Java语言关键字 当其声明一个实例变量时,当对象存储时,它的值不需要维持)代表对象的临时数据。

1.使用序列化的场合

1.需要通过网络来发送对象,或对象的状态需要被持久化到数据库或文件中。
2.序列化能实现深复制,即可以复制引用对象。

2.反序列化

将流转换为对象,在序列化与反序列化的过程中,serialVersionID起着非常重要的作用,所以在编程的时候最好显示的声明 static final serialVersionID 。

自定义serialVersionID优点:
    1.提高程序的运行效率
    2.提高程序不同平台上的兼容性
    3.增强程序各个版本之间的可兼容性

3.对象序列化(存储)的方法步骤

1.创建FileOutputStream,如果文件不存在会自动被创建
FileOutputStream fileStream = new FileOutputStream("file.ser");//创建存储文件的对象
2.创建ObjectOutputStream
ObjectOutputStream os = new ObjectOutputStream(fileStream);
3.写入对象
os.writeObject(characterOne);
4.关闭ObjectOutputStream
os.close();//关闭所关联的输出串流

提示:如果需要类被序列化,就实现Serializable接口,此接口没有任何方法需要实现。其唯一的目的就是声明有实现它的类是可以被序列化的。即此类型对象可以通过序列化机制来进行存储。

4.对象反序列化的步骤

1.创建FileInputStream类
FileInputStream fileStream = new FileInputStream("myfile.ser");
2.创建ObjectInputStream
ObjectInputStream os = new ObjectInputStream(fileStream);
3.读取文件
Object one = os.readObject();//每次调用readObject()都会从stream中读取下一个对象
4.转换对象类型
类型 name = (类型) one;//返回值是Object类型,因此需要转换类型
5.关闭ObjectInputStream
os.close();//FileInputStream会自动跟着关掉

反序列化是,Java虚拟机会通过尝试在堆上创建一个新的对象,让它维持与被序列化时有相同状态来恢复对象的原状。

package cn.edu.xidian.B.redis;

import java.io.*;

public class SerializeUtil {

    /**
     * 序列化
     * @param object
     * @return
     */
    public static byte[] serialize(Object object){
        ObjectOutputStream oos = null;
        ByteArrayOutputStream baos = null;
        try {
            baos = new ByteArrayOutputStream();
            oos = new ObjectOutputStream(baos);

            oos.writeObject(object);
            byte[] bytes = baos.toByteArray();
            return bytes;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 反序列化
     * @param bytes
     * @return
     */
    public static Object unSerialize(byte[] bytes){
        ByteArrayInputStream bais = null;
        try {
            bais = new ByteArrayInputStream(bytes);
            ObjectInputStream ois = new ObjectInputStream(bais);
            return ois.readObject();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

本文标题:序列化/反序列化

文章作者:Bangjin-Hu

发布时间:2019年10月15日 - 09:22:26

最后更新:2020年03月30日 - 08:10:33

原始链接:http://bangjinhu.github.io/undefined/Java 序列化与反序列化/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Bangjin-Hu wechat
欢迎扫码关注微信公众号,订阅我的微信公众号.
坚持原创技术分享,您的支持是我创作的动力.