Java基础之序列化与反序列化

news2024/11/17 21:39:59

序列化:将java对象转化为字节序列的过程。

反序列化:将字节序列转化为java对象的过程。

        在进行远程通信时,如果需要传输java对象:发送方需要把java对象转换为字节序列(也就是序列化),接收方需要将字节序列转换为java对象(也就是反序列化)。

        序列化的好处是实现了数据的持久化,通过序列化可以将数据永久地保存到硬盘上,也可以将对象进行网络传输。

        java.io.ObjectOutputStream表示对象输出流,writeObject(Object obj)方法可以将obj对象序列化,把得到的字节序列写入输出流中。

        java.io.ObjectInputStream表示对象输入流,readObject()方法输入流中读取字节序列,再把它们反序列化成一个对象,并返回。

        只有实现了Seriizable或Externalizable接口的类对象才能被序列化,否则会抛出异常。

序列化与反序列化功能的代码

/**
 * 序列化与反序列化
 *
 * @author hu
 * @date 2023/02/02 11:22
 */
public class SerialTest {
    // 序列化
    public static void serialize() throws IOException {

        // 声明Person对象
        Person person = new Person();
        person.setName("hu");
        person.setAge(18);
        person.setScore(1000);

        // 序列化并持久化到person.txt文件中
        ObjectOutputStream objectOutputStream =
                new ObjectOutputStream(new FileOutputStream(new File("person.txt")));
        objectOutputStream.writeObject(person);
        objectOutputStream.close();

        System.out.println("序列化成功!已经生成person.txt文件");
        System.out.println("==============================================");
    }

    // 反序列化
    public static void deserialize() throws IOException, ClassNotFoundException {
        ObjectInputStream objectInputStream =
                new ObjectInputStream(new FileInputStream(new File("person.txt")));
        Person person = (Person) objectInputStream.readObject();
        objectInputStream.close();

        System.out.println("反序列化结果为:");
        System.out.println(person);
    }

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        serialize();
        deserialize();
    }
    
}

class Person implements Serializable {
    private String name;
    private Integer age;
    private Integer score;

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", score=" + score +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Integer getScore() {
        return score;
    }

    public void setScore(Integer score) {
        this.score = score;
    }
}

Serializable接口的作用

        Serializable接口并没有任何方法,只是一个声明式接口,标记类是否可以序列化和反序列化。

serialVersionUID的作用

        反序列化需要serialVersionUID来判断版本是否一致。如果序列化的serialVersionUID与反序列化的serialVersionUID不同则无法完成反序列化。只有相同才能完成反序列化。类似于解决乐观锁ABA问题的version。

怎样排除敏感字段

        可能遇到的场景就是在序列化时有些敏感字段不方便被保留,比如用户密码,会造成安全性问题。这时候我们该怎么办呢?

        使用transtient修饰不想序列化的字段

                transtient修饰符是标记不需要持久化的字段。

        使用Externalizable接口

        Externalizable接口继承与Serializable接口,目的是满足可扩展性,让你自行实现序列化逻辑。

        在学习序列化相关知识的时候,看到有人说使用static修饰的字段也可以达到序列化屏蔽字段的效果。但是本人在测试的时候并没有体现出来。有大佬懂的话,也希望给小弟解解惑。

class Person implements Serializable {
    private String name;
    private static Integer age;
    private transient Integer score;

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", score=" + score +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        Person.age = age;
    }

    public Integer getScore() {
        return score;
    }

    public void setScore(Integer score) {
        this.score = score;
    }
}

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

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

相关文章

PHP设计模式总括篇

系列文章目录 第一章 工厂模式 第二章 抽象工厂模式 第三章 单列模式 第五章 责任链模式 第六章 策略模式 一,定义 “每一个模式描述了一个在我们周围不断重复发生的**问题,以及该问题的解决方案的核心。**这样,你就能一次又一次地使用该方…

都React V18了,还不会正确使用React Hooks吗,万字长文解析Hooks的常见问题

前言 今天主要想说一下react hooks,react hooks是react v16.8 之后引入的API,现在react都已经到V18了,hooks怎么还能不会用呢? 首先hooks引入的目的是给函数式组件增加数据状态管理的能力,同时增加代码的可复用能力。…

C++的类型转换详解

目录前言一、C语言中的类型转换二、为什么C需要四种类型转换三、C强制类型转换3.1 static_cast3.2 reinterpret_cast3.3 const_cast3.4 dynamic_cast向上转型向下转型四、RTTI(了解)总结前言 在C语言就已经存在了类型转化,但是其中的一些类型转换存在一些问题&…

4.7--贪心--多机调度问题

贪心选择--最长处理时间作业优先&#xff08;n个作业&#xff0c;m台相同机器&#xff09; 当n<m时&#xff0c;只要将机器i的[0, ti]时间区间分配给作业i即可&#xff0c;算法只需要O(1)时间。 当n>m时&#xff0c;首先将n个作业依其所需的处理时间从大到小排…

开发者开年变富,如何迈出第一步?| 「钞能力养成指北」前传

写在前面 &#xff1a; 面对全面放开后多样的消费机会&#xff0c;开发者们如何在保障品质生活的同时&#xff0c;借助开源工具&#xff0c;全面、科学地规划和管理个人财务&#xff0c;把握资金动向&#xff0c;避开消费陷阱&#xff1f; LigaAI 特邀我司 Nerd4me 大佬分享其个…

Apollo planning之交规决策技术

Apollo studio 官网&#xff1a;Apollo开发者社区 (baidu.com) 目录 1 双层状态机 2 决策模块的解析 2.1 参考路径 2.2 交规决策 2.3 路径决策 2.4 速度决策 2.5 场景的调度与管理 3 交规决策实现代码解读 3.1 遍历交规配置文件&#xff0c;存储信息 3.2 交规决…

分布式(三)

三、API 网关详解 1. 网关及作用 主要功能&#xff1a;请求过滤 网关可以为我们提供请求转发、安全认证&#xff08;身份/权限认证&#xff09;、流量控制、负载均衡、降级熔断、日志、监控等功能。 2. 常见的网关系统 2.1 Netflix Zuul &#xff08;1&#xff09;Zuul 是…

进军存储赛道—BNB Greenfield:Web3 数据所有权和效用新标准

最近BNB Chain 自豪地宣布发布BNB Greenfield 白皮书。BNB Greenfield为Web3时代的数据引入了一个全新的结构和经济模式。现在&#xff0c;数据的所有权、使用权和货币化&#xff0c;首先对用户以及BNB Chain生态系统中的所有参与者来说是可能的。BNB Greenfield 使用 BNB 作为…

OSCP_VULHUB_symfonos-2(失败)

文章目录 前言实验攻击尝试hydra爆破ftpmetasploit工具进行SSH登录端口转发1命令注入getshell 1端口转发2提权失败总结前言 这个是练习的第5个机子。 目标地址 https://www.vulnhub.com/entry/symfonos-2,331/ 实验 1.信息收集 1.1 目标ip 1.2 开放端口 nmap -sS -sV -A …

QT入门Buttons之QCommandLinkButton、QDialogButtonBox

目录 一、QCommandLinkButton界面布局介绍 二、QCommandLinkButton基本属性介绍 三、QDialogButtonBox界面布局介绍 1、布局器中的位置及使用 此文为作者原创&#xff0c;转载请标明出处&#xff01; 一、QCommandLinkButton界面布局介绍 一般这两个控件使用较少&#xf…

HarmonyOS/OpenHarmony应用开发-DevEco Studio 3.0与DevEco Studio 3.1版本差异

工程模板和开发语言介绍 DevEco Studio支持包括手机、平板、车机、智慧屏、智能穿戴、轻量级智能穿戴和智慧视觉设备的HarmonyOS应用/服务开发&#xff0c;预置了工程模板&#xff0c;可以根据工程向导轻松创建适应于各类设备的工程&#xff0c;并自动生成对应的代码和资源模板…

C生万物 | 揭开【整型提升】神秘面纱

&#x1f451;作者主页&#xff1a;Fire_Cloud_1 &#x1f3e0;学习社区&#xff1a;烈火神盾 &#x1f517;专栏链接&#xff1a;C生万物 文章目录一、前言二、整型提升的意义所在三、如何进行整型提升❓四、实战演练&#x1f5e1;1、深剖两数求和的内部运算2、三种不同数据类…

机器学习:线性回归分析女性身高与体重之间的关系

机器学习&#xff1a;线性回归分析女性身高与体重之间的关系 创作不易&#xff0c;觉得文章不错或能帮到你学习&#xff0c;记得点赞 收藏哦 文章目录机器学习&#xff1a;线性回归分析女性身高与体重之间的关系一、实验目的二、实验原理三、实验内容四、实验环境五、实验步骤…

C++ 入门基础

✨个人主页&#xff1a; Yohifo &#x1f389;所属专栏&#xff1a; C修行之路 &#x1f38a;每篇一句&#xff1a; 图片来源 The longest way must have its close,the gloomiest night will wear on a morning. 最长的路也有尽头&#xff0c;最黑暗的夜晚也会迎来清晨。 文…

擅长做财务分析的BI软件有哪些?

财务分析是企业数据分析中的一个重要板块&#xff0c;所以基本上BI软件都能做基础的财务数据分析&#xff0c;比如说帆软、永洪、思迈特等&#xff0c;但要说到系统化地、高效地做企业财务分析&#xff0c;还是要看奥威BI软件。 之所以说BI财务分析软件看奥威BI&#xff0c;是…

【万文全解】Java集合源码解析【HashMap】【ArrayList】【JDK源码集合部分】

Java集合源码解析 本文主体部分是作者跟着B站韩顺平老师的课程总结而来&#xff0c;中间穿插自己的理解还有网上各类优质解答 第一节&#xff1a;集合介绍与集合体系图 集合与数组对比&#xff08;引入集合的目的&#xff09; 数组&#xff1a; 长度必须指定&#xff0c;一…

javaEE 初阶 — TCP 流套接字编程

文章目录1. TCP 流套接字1.1 ServerSocket API1.2 Socket API1.3 TCP中的长短连接2. TCP 版本的回显服务器3. TCP 版本的回显客户端4. 如何给多个客户端提供服务1. TCP 流套接字 TCP 不需要一个类&#xff1b;来表示 “TCP” 数据报。 TCP 不是以数据报为单位进行传输的&#x…

拉伯配资“十年一剑”硕果累累 我国注册制改革迈入新征程

从2013年党的十八届三中全会明确提出“推动股票发行注册制变革”&#xff0c;到首届进博会上宣告科创板试点注册制&#xff0c;再到本年2月1日全面施行股票发行注册制变革正式发动&#xff0c;十年风雨兼程&#xff0c;我国注册制逐渐从“试点”走向“全面”。 2013年11月&…

编译链接过程详解

写在前面&#xff1a; 大家都知道&#xff0c;我们在编译器中建好一个**.c或.cpp 文件**&#xff0c;经过编译之后就可以运行了&#xff0c;也就是说我们写的.c 文件最后会变成一个可执行程序&#xff0c;那么 .c 或者 .cpp 文件是如何变成一个可执行程序的呢&#xff1f; 主要…

Vue计算属性和监视属性

目录 计算属性computed 监事属性 深度监视 计算属性computed 计算属性: 定义&#xff1a;要用的属性不存在&#xff0c;要通过已有属性计算得来 2、原理&#xff1a;底层借助了Object.defineproperty方法提供的getter和setter 3、get函数什么时候执行&#xff1f; 1、初…