java - 序列化

news2024/12/19 15:14:55

钱应该怎么花

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

像极了你的省份证号。

三、近况

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

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

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

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

争取多发几篇吧。

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

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

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

相关文章

「Linux」400行纯C语言代码带你「手撕线程池」

线程池的基本概念 不管线程池是什么东西!但是我们必须知道线程池被搞出来的目的就是:提高程序执行效率而设计出来的; 了解了线程池的目的后:我们就可以开始理解线程池: 首先回答一个问题:为什么会有线程…

python文件的读取

python文件的读取1.文件的读取1.read() 读取整个文件2.readline() 每次读取一行文件3. readlines() 读取文件的所有行2.文件的写入1.以"x"方式打开文件2.以"a"方式打开文件3.以"w"方式打开文件3.文件的删除4.Excel表数据的读取1.直接读取2.通过p…

SQL Server2019配置always on高可用图文步骤

准备工作 首先需要准备好Windows Server上的故障转移群集,步骤可以参考上一篇。 https://blog.csdn.net/u012869793/article/details/127560270?spm1001.2014.3001.5501 然后服务器上安装好SqlServer,我这里安装的是2019。 正文 勾选启用Always ON可…

牛客竞赛每日俩题 - Day7

目录 经典01背包问题 二叉树遍历与构造(考研重点) 经典01背包问题 求正数数组的最小不可组成和_百度笔试题_牛客网 参考大佬题解: 动态规划:01背包问题(无物品价值),思想相同,题目最终要求有些变化 min为…

【机器人定位引导中的机器视觉技术】

文章目录手眼标定原理手眼标定流程定位引导1、单相机抓取定位引导2、单相机纠偏定位引导3、上下相机对位引导随着工业生产中对自动化的要求越来越高,视觉技术已被广泛引入工业机器人行业,具备视觉的工业机器人能更快、更准、更灵活地完成定位抓取、对位组…

Linux系统 (三)- 权限介绍

~~~~前言命令行解释器 -- Command Line Interpreter ShellLinux操作系统命令行解释器对命令行解释器的初步认识命令行解释器的意义shell分类命令行解释器 CLI Shell图形界面 GUI ShellLinux权限Linux中用户分类su基本语法sudo基本语法配置操作权限管理权限是什么文件分类文件属…

【一起学数据结构与算法】计数排序、基数排序、桶排序(含菜鸟教程代码)

目录前言一、计数排序1.1 排序思想1.2 代码1.3 菜鸟教程官方代码(搬运)二、基数排序2.1 排序思想2.2 代码2.3 菜鸟教程官方代码(搬运)三、桶排序3.1 排序思想3.2 代码3.3 菜鸟教程官方代码(搬运)前言 之前我们学过了几种常见的排序,都是基于比较的排序,…

ES6中扩展对象的功能性

对象是JavaScript编程的核心,ECMAScript6为对象提供了许多简单易用且更加灵活的新特性。 ECMAScript 6在对象字面量的基础上做出了以下几个变更: 简化属性定义语法,使将当前作用域中的同名变量赋值给对象的语法更加简洁 function createPe…

【MySQL】MySQL基本操作详解

系列文章目录 第1篇:【MySQL】MySQL介绍及安装 第2篇:【MySQL】MySQL基本操作详解 文章目录 ✍1,数据库操作     🔍1.1,查看数据库     🔍1.2,创建数据库     🔍1.3,选择数据库     &…

Kubernetes基础_02_Pod全解析

系列文章目录 文章目录系列文章目录前言一、Pod的生命周期Lifecycle二、Pod的重启策略RestartPolicy三、静态Pod四、Pod的健康检查总结前言 Pod是Kubernetes最小单位,当然一个Pod可以有多个Container,但是container是docker的元素,不是Kuber…

CTFHub | 布尔盲注

0x00 前言 CTFHub 专注网络安全、信息安全、白帽子技术的在线学习,实训平台。提供优质的赛事及学习服务,拥有完善的题目环境及配套 writeup ,降低 CTF 学习入门门槛,快速帮助选手成长,跟随主流比赛潮流。 0x01 题目描述…

无限题库公众号系统搭建

无限题库公众号系统搭建 本平台优点: 多题库查题、独立后台、响应速度快、全网平台可查、功能最全! 1.想要给自己的公众号获得查题接口,只需要两步! 2.题库: 查题校园题库:查题校园题库后台(…

《设计模式:可复用面向对象软件的基础》——行为模式(笔记)

文章目录五、行为模式5.1 CHAIN OF RESPONSIBILITY(职责链)1.意图2.动机3.适用性4.结构5.参与者6.协作7.效果8.实现9.代码示例10.相关模式5.2 COMMAND(命令)1.意图2.别名3.动机4.适用性5.结构6.参与者.7.协作8.效果9.实现10.代码示例11.相关模式5.3 INTE…

CSDN独家 | 全网首发 | Pytorch深度学习·理论篇(2023版)目录

很高兴和大家在这里分享我的最新专栏 Pytorch深度学习理论篇(2023版),恭喜本博客浏览量达到两百万,CSDN内容合伙人,CSDN人工智能领域实力新星~ 0 Pytorch深度学习理论篇实战篇(2023版)大纲 1 Pytorch深度学习理论篇实战篇(2023版)专栏地址&…

嵌入式应用-详解移植并使用freetype显示文字

目录 前言 1. freetype和相关概念简介 2.freetype显示文字流程和主要函数 2.1 包含头文件及API头文件:ft2build.h 2.2 初始化: FT_InitFreetype 2.3 加载(打开)字体Face: FT_New_Face 2.4 设置字体大小&#x…

sqrt函数模拟实现的两种方法

起因:在leetcode刷题时,有一道题目考察了有关sqrt的原理的题目,当时就去查了网上的文章,结果发现,一开始的时候看的很懵,最后也是搞定了两种方法,今天我就以最简单的方式写下这两种方式的思路讲解&#xff…

Python批量获取高校基本信息

文章目录前言一、需求二、分析三、处理四、运行效果前言 为了更好的掌握数据处理的能力,因而开启Python网络爬虫系列小项目文章。 小项目小需求驱动,每篇文章会使用两种以上的方式(Xpath、Bs4、PyQuery、正则等)获取想要的数据。…

T31快启图像效果优化

T31快启图像效果优化 liwen01 20220821 (一)基础方法及概念 参考文档 《Ingenic_Zeratul_T31_快起效果调试说明_20200927_CN》 (1)起始EV参数 IPC 每次启动都是冷启动,画面有一个暗变亮的过程,称作为AE收敛过程(自动曝光收敛过程)。 为了加快AE收…

LeetCode50天刷题计划第二季(Day 23 — 重排链表(16.20- 17.00)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、题目重排链表示例提示二、思路三、代码前言 链表基础题加一 一、题目 重排链表 给定一个单链表 L 的头节点 head ,单链表 L 表示为&#xff…