java中的序列化解析

 更新时间:2023年09月27日 10:17:29   作者:grace.free  
这篇文章主要介绍了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

在这里插入图片描述

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

其他

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

比如:

  • Json序列化
  • 谷歌Gson的Json 、阿里的FastJson 、Jackson 等
  • ProtoBuff序列化 据说做游戏的很多用这个 是谷歌出的 会大大节省传输流量

二、Serializable 接口

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

到此这篇关于java中的序列化解析的文章就介绍到这了,更多相关java序列化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java冒泡排序简单实例

    java冒泡排序简单实例

    本文主要介绍了JSONjava冒泡排序实例与思路分析。具有一定的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • Java实现简单的RPC框架的示例代码

    Java实现简单的RPC框架的示例代码

    本篇文章主要介绍了Java实现简单的RPC框架的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • Java使用junit框架进行代码测试过程详解

    Java使用junit框架进行代码测试过程详解

    单元测试就是针对最小的功能单元编写测试代码,Junit是使用Java语言实现的单元测试框架,它是开源的,Java开发者都应当学习并使用Junit编写单元测试。本文就来讲讲Junit框架的使用教程,需要的可以参考一下
    2023-02-02
  • Http学习之组装报文

    Http学习之组装报文

    这篇文章主要介绍了Http学习之组装报文,组装报文就是指组装HTTP响应报文,你需要返回客户请求的相应资源,通常一个完整的报文包括报文头和报文体,一起来看看吧
    2023-04-04
  • 带你入门Java的集合

    带你入门Java的集合

    Java的集合类型都是对java.util包中Collection接口的继承,这里我们主要介绍依赖于collection的一些主分支,一起来看一下Java中的collection集合类型总结
    2021-07-07
  • MyBatis框架简介

    MyBatis框架简介

    本文主要介绍了MyBatis框架的基础知识。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03
  • 最通俗的白话讲解JDK源码中的ThreadLocal

    最通俗的白话讲解JDK源码中的ThreadLocal

    ThreadLocal是JDK包提供的,它提供线程本地变量,如果创建一乐ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的一个副本,在实际多线程操作的时候,操作的是自己本地内存中的变量,从而规避了线程安全问题,感兴趣的朋友快来看看吧
    2022-01-01
  • Java实现和电脑玩剪刀石头布游戏

    Java实现和电脑玩剪刀石头布游戏

    这篇文章主要为大家详细介绍了Java实现和电脑玩剪刀石头布游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Java中常见字符串拼接九种方式详细例子

    Java中常见字符串拼接九种方式详细例子

    这篇文章主要给大家介绍了关于Java中常见字符串拼接的九种方式,字符串拼接是我们在Java代码中比较经常要做的事情,就是把多个字符串拼接到一起,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • 详解Spring Cloud中Hystrix 线程隔离导致ThreadLocal数据丢失

    详解Spring Cloud中Hystrix 线程隔离导致ThreadLocal数据丢失

    这篇文章主要介绍了详解Spring Cloud中Hystrix 线程隔离导致ThreadLocal数据丢失,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03

最新评论