java中的序列化与反序列化-----(跟你说了一万遍,你咋就不懂呢)

一、定义:

  • 官方一点的解释:

    序列化:

    ​ 就是把内存中的状态通过转换成字节码的形式,从而转换一个I/O流,写入其它地方(可以式磁盘,网络I/O

    反序列化:

    ​ 就是将已经持久化的字节码内容转换为I/O流,通过I/O流的读取,进而将读取的内容转换为java对象

  • 放牛娃的理解解释:

    序列化:

    ​ 将java对象转化成流(这个序列化流就是保存着java对象的结构)

    反序列化:

    ​ 将序列化流转化成java对象

二、如何实现

1. 方法:

  • 简单粗暴的,实现Serializable 接口

2. 代码实战:

  • 未添加序列化版本号,仔细观察了哈!!!
package chen.com.seriable_study;

import java.io.Serializable;

/**
 * 序列化,反序列化的学习
 * author: 放牛娃
 * 公众号:放牛娃学编程
 */
public class Annimal implements Serializable {
    //不添加序列化版本,仔细观察(先注释掉)
	// private static final long serialVersionUID = 1l;
    // 动物名称
    private String name;
    // 年龄
    private int age;

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Annimal{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

//测试代码
package chen.com.seriable_study;

import java.io.*;

/**
 * 测试
 */
public class Seriable_test {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        Annimal annimal = new Annimal();
        annimal.setAge(2);
        annimal.setName("小猫");

        //序列化
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("d:/annimalSeriable.txt"));
        objectOutputStream.writeObject(annimal);
        objectOutputStream.close();

        //反序列化
       ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("d:/annimalSeriable.txt"));
        Annimal animal2 = (Annimal)objectInputStream.readObject();
        System.out.println("animal2.toString() = " + animal2.toString());
    }
}

(1)结果:

  • 序列化后d盘下:
    在这里插入图片描述

  • 反序列化后控制台:
    在这里插入图片描述(2)为动物添加一个速度属性,再反序列化试试看
    在这里插入图片描述
    原因分析:

  • 因为增加了一个属性,所以当前的序列化版本就对不上了,所以一般都是显示写上序列化版本号(上面的注释放开)。

  • 如果我们保持了serialVersionUID的一致,则在反序列化时,对于新增的字段会填入默认值null(int的默认值0),对于减少的字段则直接忽略。

看到这里的小伙们,再不点赞就说不过去了吧

三、分享交流

最后有兴趣一起交流的,可以关注我的公众号:这里你能够学到很实用的技巧,不是常用的我不说,公众号回复提取码即可获取以下学习资料啦啦啦啦,喜欢就拿去吧!!

(链接时常会失效,若出现此类情况,可以加我微信:17722328325(加时请备注:学习资料))

  1. Java web从入门到精通电子书

  2. Python机器学习电子书

  3. Python400集(北京尚学堂)

  4. JavaScript项目案例、经典面试题

  5. Java300集(入门、精通)

  6. Java后端培训机构录集(同事培训内部提供)

  7. java重要知识pdf文档(价值连城呀呀,不收藏你会后悔的)



        喜欢就关注吧,点个赞吧
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值