java - 序列化

发布于:2022-10-29 ⋅ 阅读:(364) ⋅ 点赞:(0)

钱应该怎么花

前几天看到一个新闻,一女子打拼了5年攒了30万买房钱,最后因为意外被一场突如其来的大火烧了,经过多家银行,长达4小时的鉴定,挽回了15万损失。

还看到一个新闻,老人攒5000元钱遭虫蛀烂,结果银行由于规定无法兑换残币,只能自己承受了损失。

当然了,也有某银行存款取不出来的新闻。

所以有了钱最好还是存到一个比较大一点的银行,比如我国的七大行。

或者你也可以换成金条存起来,金条不会被虫子咬,着火了也不会损失很多。

当然你也可以去把钱变成韭菜,让别人割。

这让我想起一个Java知识点。叫做序列化。

一、序列化

为了将对象进行网络传输或者是持久化,我们需要将对象的状态信息转换为可以存储或者传输的形式。

这个转换的过程就叫序列化

jre能力

Jre本身提供了序列化的支持,我们可以调用outputStreamwriteObject方法

如果让Java帮我们做的话,我们需要实现Serializable接口,这个接口是一个mini接口,没有需要实现的方法,说白了,只是做一个标记。

package freeedu.test;

import java.io.*;

/**
 * @author 木子的昼夜编程
 */
public class SerTest {
    public static void main(String[] args) throws Exception {
        // 创建对象
        Person p = new Person("小花", 18, "女");
        // 创建ObjectOutputStream
        ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("E:/MyNote/obj/Person.obj"));
        // 持久化
        outputStream.writeObject(p);
    }
}

// 人 未实现Serializable
class Person{
    String name;
    int age;
    String gender;

    public Person(String name, int age, String gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }
}

读者朋友仔细看看,这样写对吗?

一般问你对不对,那肯定就是不对啦!

使用JRE自带序列化功能,被序列化的对象必须实现Serializable,否则就会报错

在这里插入图片描述

下面才是正确的写法:

package freeedu.test;

import java.io.*;

/**
 * @author 木子的昼夜编程
 */
public class SerTest {
    public static void main(String[] args) throws Exception {
        // 创建对象
        Person p = new Person("小花", 18, "女");
        // 创建ObjectOutputStream
        ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("E:/MyNote/obj/Person.obj"));
        // 持久化
        outputStream.writeObject(p);
    }
}

// 人  实现Serializable
class Person implements Serializable{
    String name;
    int age;
    String gender;

    public Person(String name, int age, String gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }
}

执行成功之后,看一看文件内容?

在这里插入图片描述

看不懂?没关系,我们可以反序列化,再看内容

package freeedu.test;

import java.io.*;

/**
 * @author 木子的昼夜编程
 */
public class DesTest {
    public static void main(String[] args) throws Exception {
        // 创建ObjectInputStream
        ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("E:/MyNote/obj/Person.obj"));
        // 读取对象
        Object o = inputStream.readObject();
        // 判断对象持久化对象是不是Person
        if (o instanceof Person) {
            // 如果是的话 强转
            Person p = (Person) o;
            // 打印信息
            System.out.println(p.age);
            System.out.println(p.name);
            System.out.println(p.gender);
        }

    }
}

在这里插入图片描述

Serializable

在这里插入图片描述

可以看到,他只是一个接口,没有任何需要实现的内容。

3. 其他

当然了,这只是Java自带的序列化,我们平时网络传输等会使用到很多其他序列化。

比如:

  • Json序列化

    谷歌Gson的Json 、阿里的FastJson 、Jackson 等

  • ProtoBuff序列化 据说做游戏的很多用这个 是谷歌出的 会大大节省传输流量

二、唠叨

我们看java自带序列化,需要实现一个Serializable,而实现这个接口,要求我们需要添加一个serialVersionUID 属性,就像下边这样

// 人
class Person implements Serializable{
    // 定义serialVersionUID
    private static final long serialVersionUID = 8940196742313994740L;
    String name;
    int age;
    String gender;

    public Person(String name, int age, String gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }
}

如果你不定义这个serialVersionUID,jdk会根据序列化类的信息,比如字段等自动生成一个,但是你如果修改了这个类(比如添加字段),然后再反序列化没有修改之前序列化的内容就会报错

比如我们修改一下Person类,然后反序列化一下上边那个文件

class Person implements Serializable{
    String name;
    int age;
    String gender;

    String aaaaaaa;
    public Person(String name, int age, String gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }
}

在这里插入图片描述

如果Person类在序列化的时候定义了serialVersionUID,那么就不会出现这个问题

这个serialVersionUID很像是我们的银行卡号,如果你的银行卡没卡号,只是根据你的手机号,或者是你的姓名进行绑定,那么当你手机号变更了,或者名称变更了,那么就对应不上你的卡了。所以我们银行卡都有一个卡号,这个卡号随银行卡产生而产生,随银行卡注销而注销。

像极了你的省份证号。

三、近况

每个人多多少少都会遇到一些糟心的事儿,有的人是靠着朋友唠叨来化解,有的人是通过打游戏来化解,有的人是通过出去游玩来化解。不管是什么途径,不快乐的情绪一定要化解掉,不能让它在身体里边积攒。

有的人说:你要相信,花开以后会结果。

我觉得没必要看中结果,既然你欣赏了花开的美,何必再去追求结果,如果能结果,那再好不过,如果没结果,我们继续寻找下一颗美丽的花朵。不必苦苦等待果实的到来。

看了看记录,也好久没有发文章了,可能很多原因吧,但那都是借口。

争取多发几篇吧。

欢迎关注公众号:木子的昼夜编程

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到