序列号和反序列化--java--Serializable接口--json序列化普通使用

news2024/11/16 8:25:15

序列化和反序列化

  • 序列化和反序列化
    • 作用
    • 为什么需要
    • 用途
  • Serializable
    • 使用
    • serialVersionUID
      • 不设置的后果
      • 什么时候修改
  • Externalizable
    • 序列化的顺序
  • json序列化

序列化和反序列化

序列化:把对象转换为字节序列的过程称为对象的序列化。
反序列化:把字节序列恢复为对象的过程称为对象的反序列化。

其实就是将代码中运行的对象从内存中保存为字节序列可以存储和传输。

作用

  1. 把对象的字节序列永久地保存到硬盘上(通常存放在一个文件中);
  2. 在网络上传送对象的字节序列。

为什么需要

Java对象是运行在JVM的堆内存中的,如果JVM停止后,它的生命也就戛然而止。
如果想在JVM停止后,把这些对象如何保存起来呢。我们只能保存到硬盘上或者传输到其他地方了,但是很多硬件或者说传输只支持二进制而不认识java的对象,所以需要将这些对象转换成字节序列了。
我感觉和高级语言编译成二进制差不多。java对象是我们好理解的,二进制是机器理解的。

用途

  1. 可以做对象的备份会恢复
  2. 兼容性规定
  3. 数据存储,保存到数据库、文件等
  4. 传输

怎么样序列化需要我们来规定,所以学习这些规定的方法
如果不规定则会报错
MyArrayList 是自己实现的一个动态数组的类,还未实现Serializable接口

public void testSerializable() {
    MyArrayList list = new MyArrayList();
    for (int i = 0; i < 100; i++) {
        list.add(i);
    }
    try(
            ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream("a.txt"));
            ObjectInputStream in = new ObjectInputStream(new FileInputStream("a.txt"));
    ) {
        o.writeObject(list);
        MyArrayList l = (MyArrayList) in.readObject();
        System.out.println(l);
    } catch (IOException | ClassNotFoundException e) {
        throw new RuntimeException(e);
    }
}

会出现这样的错误
在这里插入图片描述
在这里插入图片描述

Serializable

Serializable接口是一个标记接口,没有方法或字段。一旦实现了此接口,就标志该类的对象就是可序列化的。
这种是隐式序列化(不需要手动),这种是最简单的序列化方式,会自动序列化所有非static和 transient关键字修饰的成员变量

使用

实现之后在运行上面代码
在这里插入图片描述
a.txt,看不懂的
在这里插入图片描述

serialVersionUID

意思就是序列化版本号ID,其实每一个实现Serializable接口的类,都有一个表示序列化版本标识符的静态变量,或者默认等于1L,或者等于对象的哈希码。

JAVA序列化的机制是通过判断类的serialVersionUID来验证版本是否一致的。在进行反序列化时,会把serialVersionUID和本地相应实体类的serialVersionUID进行比较,如果相同,反序列化成功,如果不相同,就抛出InvalidClassException异常。
修改一下在读取,记得注释掉序列化的代码在这里插入图片描述

不设置的后果

在类中新增一个不使用的字段
在这里插入图片描述
然后序列化后删除这个字段
我们会发现其报错

Caused by: java.io.InvalidClassException: 
com.yu.MyArrayList; local class incompatible:
 stream classdesc serialVersionUID = 8278873907900787181, 
 local class serialVersionUID = -9196603521067733754

我们不是没有设置这个字段吗,怎么报错会显示这个呢。这个是怎么来的

在没有定义 serialVersionUID的时候,就会生成默认的序列化唯一标示。
他的生成规则是根据类名,方法和属性等参数生成的 hash 值

所以在删除后其hash值会改变。
但是这个字段对于我们来说毫无影响,所以我们可以自行设置serialVersionUID 的值
在进行上面操作且不修改serialVersionUID 的值,会发现代码通过了。

什么时候修改

在阿里巴巴开发手册中有
在这里插入图片描述
不是说一定不能修改,在不兼容的时候在修改。

就像上面的这个字段对代码毫无影响,那么我们就不需要修改了。
这个应该强制一下实现了这个接口的就必须赋初值,不然随便修改一下属性就不能反序列化了。

这就是差不多是一个兼容性问题,就像各个版本的JDK代码都拿出来看一下,那些向下兼容的类的serialVersionUID是没有变化过的。

Externalizable

Externalizable继承了Serializable接口,还定义了两个抽象方法:writeExternal()和readExternal(),如果开发人员使用Externalizable来实现序列化和反序列化,需要重写writeExternal()和readExternal()方法

在这里插入图片描述
这2个方法给定了流,直接调用流的方法自定义读和写就行

如我什么都不序列化,获取里面的大小就是0
在这里插入图片描述
只序列化大小
在这里插入图片描述

如果我序列化大小和容量,打印数据就会报错。
因为我们的类中的数组没有这么大初始为空,所以会报错。

序列化的顺序

那么我们如果重复序列化size会发生什么
在这里插入图片描述
获取其中的size和capacity
在这里插入图片描述

我们来混乱的定义在这里插入图片描述
打印结果
在这里插入图片描述
可以看到顺序和我们序列化的顺序一样和属性无关

最后我们用不同属性进行
发现了几点规律
接收和发送顺序完全一样,不会是int读int,object读object。
顺序错了会报错
在这里插入图片描述

不同类型混合接收
至于为什么是这样,应该涉及太底层的,我还不知道,到时候看流的底层的时候在看看。
在这里插入图片描述

json序列化

json使用就比较简单

在这里插入图片描述
但是会报错。
这里看到只序列化了size。
因为fastjson会扫描其中的getter方法,我们只设置了getSize方法。
所以其他的访问不到。
json的具体内容以后在说,这里只介绍其普通使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/389765.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Go语言学习】安装与配置

文章目录前言一、Go语言学习站二、安装与配置1.安装2.环境变量配置3.Gland编辑器安装与配置Hello, World!总结前言 Go语言特性 Go&#xff0c;又称为 Golang&#xff0c;是一门开源的编程语言&#xff0c;由 Google 开发。Go 语言的设计目标是提供一种简单、快速、高效、安全…

在MySQL中使用不等于符号还能走索引吗?

一般情况下&#xff0c;我们会在一个索引上较多的使用等值查询或者范围查询&#xff0c;此时索引大多可以帮助我们极快的查询出我们需要的数据。 那当我们在where条件中对索引列使用!查询&#xff0c;索引还能发挥他的作用吗&#xff1f; 以此SQL为例&#xff1a; select * …

农产品销售系统的设计与实现

技术&#xff1a;Java、JSP等摘要&#xff1a;这篇文章主要描述的是农产品蔬菜在线销售系统的设计与实现。主要应用关于JSP网站开发技术&#xff0c;并联系到网站所处理的数据的结构特点和所学到的知识&#xff0c;应用的主要是Mysql数据库系统。系统实现了网站的基本功能&…

计算机组成原理|第一章(笔记)

目录第一章 计算机系统概论1.1 计算机系统简介1.1.1 计算机的软硬件概念1.1.2 计算机系统的层次结构1.1.3 计算机组成和计算机体系结构1.2 计算机的基本组成1.2.1 冯 诺伊曼计算机的特点1.2.2 计算机的硬件框图1.2.3 计算机的工作过程1.3 计算机硬件的主要技术指标1.3.1 机器字…

kaggle数据集下载当中所遇到的问题

kaggle数据集下载当中所遇到的问题报错分析pip install kagglethe SSL module is not available解决方法pip的版本升级解决办法下载kaggle包kaggle数据集下载问题解决参考内容报错分析 今天在尝试使用pip install kaggle的方法去下载我需要的数据集的时候遇到了一些报错的问题…

二分查找与判定树

二分查找的算法思想二分查找也称“折半查找”&#xff0c;要求查找表为采用顺序存储结构的有序表。本例一律采用升序排列。二分查找每一次都会比较给定值与序列[low,high]的中间元素&#xff0c;该元素的下标为mid (lowhigh)/2,若两者相等&#xff0c;则返回元素的下标为mid;如…

Django的DRF从入门到精通

第一讲:建立纯净版Django项目 ① 创建Django项目 ② 创建app一个 python manage.py startapp APP名字 ③ 在settings里配置rest_framework,把不需要的全部注释掉 INSTALLED_APPS = [# django.contrib.admin,# django.contrib.auth,# django.contrib.contenttypes,# djang

centos7 安装 MySQL5.7

1.下载MySQL官方的 Yum Repository wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm2.安装 Yum Repository yum -y install mysql57-community-release-el7-10.noarch.rpm3 使用 yum 安装 MySQL yum -y install mysql-community-server若…

推荐系统1--Deepfm学习笔记

目录 1 keras实现Deepfm demo 2 deepctr模版 3 其他实现方式 ctr_Kera 模型 数据集 预处理 执行步骤 4何为focal loss 参考 1 keras实现Deepfm 假设我们有两种 field 的特征&#xff0c;连续型和离散型&#xff0c;连续型 field 一般不做处理沿用原值&#xff0c;离散型一…

Promise学习基础学习 promise封装fs模块、AJAX请求

Promise 是什么&#xff1f; 抽象表达&#xff1a; 1、Promise 是一门新的技术&#xff08;ES6规范&#xff09; 2、Promise 是JS中进行异步编程的新解决方案 备注&#xff1a;旧方案是单纯使用回调函数 具体表达&#xff1a; 1、从语法上来说&#xff1a;Promise 是一个构造…

QML Loader(加载程序)

Loader加载器用于动态加载 QML 组件。加载程序可以加载 QML 文件&#xff08;使用 source 属性&#xff09;或组件对象&#xff08;使用 sourceComponent 属性&#xff09; 常用属性&#xff1a; active 活动asynchronous异步&#xff0c;默认为falseitem项目progress 进度so…

package.json中 版本号详解

1. 版本号简介 软件版本号有四部分组成&#xff1a; 第一部分&#xff1a;主版本号&#xff0c;当进行不兼容的 API 更改时&#xff0c;则升级主版本&#xff1b;第二部分&#xff1a;次版本号&#xff0c;当以向后兼容的方式添加功能时&#xff0c;则升级次版本&#xff1b;…

FPGA实现SDI视频编解码 SDI接收发送,提供2套工程源码和技术支持

目录1、前言2、设计思路和框架SDI接收SDI缓存写方式处理SDI缓存读方式处理SDI缓存的目的SDI发送3、工程1详解4、工程2详解5、上板调试验证并演示6、福利&#xff1a;工程代码的获取1、前言 FPGA实现SDI视频编解码目前有两种方案&#xff1a; 一是使用专用编解码芯片&#xff0…

【玩转c++】vector讲解和模拟底层实现

本期主题&#xff1a;vector的讲解和模拟实现博客主页&#xff1a;小峰同学分享小编的在Linux中学习到的知识和遇到的问题小编的能力有限&#xff0c;出现错误希望大家不吝赐vector的介绍及使用1.1vector的介绍vector其实就是一个数组的模板 &#xff0c;存放的数据可以改变而已…

不想长大,却又期待成长

长大后的世界、 会让我觉得很陌生、很陌生、 为什么我们都要长大、 为什么要学会独立&#xff1f;甚至还恨害怕长大。. 因为没有依靠、没有安全感、 虽然我知道、总有一天我要步入这个大人的世界、 可是不想、害怕、害怕自己会受伤、 世界的变化、太快了、太快了、 成人的世…

PMP项目管理项目运行环境

目录1 概述2 事业环境因素和组织过程资产3 组织系统3.1 概述3.2 组织治理框架3.2.1 治理框架3.2.2 项目治理3.3 管理要素3.4 组织结构类型3.4.1 组织结构类型3.4.2 项目管理办公室1 概述 项目所处的环境可能对项目的开展产生有利或不利的影响&#xff0c;这些影响的两大主要来…

数据结构——链表讲解(2)

作者&#xff1a;几冬雪来 时间&#xff1a;2023年3月5日 内容&#xff1a;数据结构链表讲解 目录 前言&#xff1a; 剩余的链表应用&#xff1a; 1.查找&#xff1a; 2.改写数据&#xff1a; 3.在pos之前插入数据&#xff1a; 4.pos位置删除&#xff1a; 5.在pos的后…

零死角玩转stm32初级篇1-STM32如何编译和下载程序

本篇博文目录:一.程序的编译二.程序的下载1.ISP方式2.JTAG方式3.SWD方式4.SWIM方式一.程序的编译 Keil uVision5 工具中有四个编译如图&#xff0c;他们分别表示什么意思,下面进行介绍,解释来源于<<零死角玩转stm32>>。 第一个按钮&#xff1a; Translate 就是翻译…

【项目实战】Linux下安装Nginx教程

一、环境准备 Linux版本&#xff1a;CentOS7 64位 二、具体步骤 2.1 步骤1&#xff1a;确认系统中安装以下基础依赖 确认系统中安装了gcc、pcre-devel、zlib-devel、openssl-devel。 在安装Nginx前首先要确认系统中安装了gcc、pcre-devel、zlib-devel、openssl-devel。 yu…

Feature interation—— Bridge、Fusion、Filte

Feature interation&#xff08;特征交互&#xff09;&#xff1a;物品不同模态的表示属于不同的语义空间&#xff0c;并且每个用户对模态也有不同的偏好。因此&#xff0c;多模态推荐系统&#xff08;MRS&#xff09;寻求融合和交互多模态特征来生成用户和物品的特征表示。特征…