Java之序列化理解及其作用

什么是序列化,有什么用?

官方说 : 序列化(Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程.
在序列化期间,对象将其当前状态写入到临时或持久性存储区 . 以后 ,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象.

通俗上说 : 序列化就是可以将内存中Java对象可以写在硬盘上(序列化到硬盘上) , 反序列化就是将硬盘的内容读取到内存中;
Java是通过实现Serialization接口 ,实现的序列化. 注 : Serialization接口里面没有方法,就是个标识接口.

通常,对象实例的所有字段都会被序列化,这意味着数据会被表示为实例的序列化数据。这样,能够解释该格式的代码有可能能够确定这些数据的值,而不依赖于该成员的可访问性。类似地,反序列化从序列化的表示形式中提取数据,并直接设置对象状态,这也与可访问性规则无关。

序列化的条件是什么?

该类必须实现 java.io.Serializable 接口

该类的所有属性必须是可序列化的。如果有一个属性不是可序列化的,则该属性必须注明是短暂的。

既然实现序列化,那什么是serialVersionUID?

SerialVersionUID是一个标识符,当它通常使用对象的哈希码序列化时会标记在对象上。
我们可以通过Java中serialver工具找到该对象的serialVersionUID。
SerializableID 号是根据类的特征类的签名算出来的。
Serializable 是用于判断类和对象是否是同一个版本

如果可序列化类未显式声明 serialVersionUID,则序列化运行时将基于该类的各个方面计算该类的默认 serialVersionUID 值。原因是计算默认的 serialVersionUID 对类的详细信息具有较高的敏感性,根据编译器实现的不同可能千差万别,这样在反序列化过程中可能会导致意外InvalidClassException。

怎么实现序列化操作?

  1. 序列化操作(ObjectOutputStream(序列化流))
/**
     * 序列化保存USer 对象
     * User user = new User(username,password,phonePackage,recharge,telephone);
     *          //序列化保存
     * userService.saveUser(user);
     */
    public void saveUser(User user){
        File folder = new File("d:"+File.separator+"兜兜项目");
        if(!folder.exists()) folder.mkdir();
        File file = new File(folder,user.getTelephone());
        try(ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(file))){
            file.createNewFile();
            os.writeObject(user);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
  1. 反序列化(ObjectIntputStream(反序列化流))
/**
     * 反序列化 查询用户信息
     * 根据手机号查询
     * 返回user
     */
    public User finduser(String telephone){
        File folder = new File("d:"+File.separator+"兜兜项目");
        if(!folder.exists()) folder.mkdir();
        File file = new File(folder,telephone);
        if(!file.exists()) return null;
            try(ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file))) {
                file.createNewFile();
                return (User) ois.readObject();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
    }

总结

一、使用序列化一定要实现Serialization接口
二、使用序列化步骤:1. 创建序列化流 2. 调用 writeObject 方法, 写对象 3. 释放资源.
三、使用反序列化步骤: 1. 创建 ObjectInputStream 反序列化流 2. 调用 readObject 方法,读对象 3. 释放资源
四、如果某个类能够被序列化,其子类也可以被序列化.
五、声明为statictransient类型的成员数据不能被序列化. 因为static代表类的状态, transient代表对象的临时数据
六、java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接上传递。利用对象序列化可以进行对象的"深复制",即复制对象本身及引用的对象本身。序列化一个对象可能得到整个对象序列。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值