• java - 序列化


    钱应该怎么花

    前几天看到一个新闻,一女子打拼了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;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

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

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

    使用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;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

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

    在这里插入图片描述

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

    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);
            }
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    在这里插入图片描述

    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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    如果你不定义这个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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述

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

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

    像极了你的省份证号。

    三、近况

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

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

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

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

    争取多发几篇吧。

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

  • 相关阅读:
    conda从4.12升级到最新版23.9 自动升级失败 手动升级方法
    Linux: memory: memblock: debug
    【蓝桥杯】赢球票(模拟、枚举、搜索)
    C++ 模板 - CRTP 技法
    POS 之 验证者如何才能提议区块
    在 CentOS 6.4上安装rabbitmq
    python调用gurobi时,通过.x获取变量值
    GitHub访问慢解决办法
    ES6新特性之箭头函数
    解决gpt无法发送对话的问题
  • 原文地址:https://blog.csdn.net/qq_36291682/article/details/127592928