Java中什么序列化?

news2024/11/15 12:11:06

在这里插入图片描述

在这里插入图片描述

在Java中,序列化是一种将对象转换为字节序列的机制,使得对象可以在网络上传输或存储到文件中,而后可以通过反序列化还原为对象。Java提供了java.io.Serializable接口,通过实现这个接口的类可以实现对象的序列化和反序列化。

序列化的本质就是把对象内存中的数据按照一定的规则,变成一系列的字母数据,然后再把这些字节数据写入到流中。而反序列化是逆过程,先读取字节数据,然后组装成Java对象
所有需要进行序列化的类,都必须实现Serializable接口,必要时还需要提供静态的常量serialVersionUID

基本概念

  1. Serializable接口java.io.Serializable是一个标记接口,没有任何方法。如果一个类实现了这个接口,表明该类可以被序列化。

  2. ObjectOutputStream和ObjectInputStream:这两个类用于将对象序列化为字节流和从字节流反序列化为对象。

序列化的步骤

  1. 实现Serializable接口:要使一个类可以被序列化,只需实现Serializable接口。这是一个空接口,只是用于标记。

    import java.io.Serializable;
    
    public class MyClass implements Serializable {
        // 类的成员和方法
    }
    
  2. 使用ObjectOutputStream进行序列化:将对象写入到输出流中。

    try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("data.ser"))) {
        MyClass obj = new MyClass();
        oos.writeObject(obj);
    } catch (IOException e) {
        e.printStackTrace();
    }
    

    上述代码将MyClass对象写入到名为"data.ser"的文件中。

  3. 使用ObjectInputStream进行反序列化:从输入流中读取字节并将其还原为对象。

    try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("data.ser"))) {
        MyClass obj = (MyClass) ois.readObject();
        // 使用反序列化得到的对象
    } catch (IOException | ClassNotFoundException e) {
        e.printStackTrace();
    }
    

    注意:反序列化时需要进行强制类型转换,并捕获ClassNotFoundException异常。

序列化的注意事项

  1. 版本兼容性:当类的结构发生变化时,可能导致反序列化失败。为了解决这个问题,可以使用serialVersionUID显式声明序列化版本号,并确保在类发生变化时更新它。

    private static final long serialVersionUID = 1L;
    
  2. transient关键字:通过将字段标记为transient,可以阻止它们被序列化。这在某些情况下是有用的,例如,如果一个字段不应该被传输或保存。

    private transient int sensitiveData;
    
  3. 自定义序列化和反序列化方法:可以通过实现writeObjectreadObject方法来自定义序列化和反序列化的过程,以便处理一些特殊逻辑。

    private void writeObject(ObjectOutputStream oos) throws IOException {
        // 自定义序列化逻辑
        oos.defaultWriteObject();
    }
    
    private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
        // 自定义反序列化逻辑
        ois.defaultReadObject();
    }
    

如何序列化和反序列化Java对象

下面是一个简单的Java代码示例,演示如何序列化和反序列化一个对象:

import java.io.*;

// 实现Serializable接口
class Person implements Serializable {
    private static final long serialVersionUID = 1L;

    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

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

public class SerializationExample {
    public static void main(String[] args) {
        // 序列化对象
        serializeObject();

        // 反序列化对象
        deserializeObject();
    }

    private static void serializeObject() {
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"))) {
            // 创建一个Person对象
            Person person = new Person("John Doe", 30);

            // 将对象写入输出流
            oos.writeObject(person);

            System.out.println("Object serialized successfully.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void deserializeObject() {
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser"))) {
            // 从输入流中读取对象
            Person deserializedPerson = (Person) ois.readObject();

            System.out.println("Object deserialized successfully.");
            System.out.println("Deserialized Person: " + deserializedPerson);
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

在这个例子中,Person类实现了Serializable接口,然后在SerializationExample类中,通过ObjectOutputStreamPerson对象序列化到文件"person.ser"中,再通过ObjectInputStream从文件中反序列化出一个新的Person对象。注意,serialVersionUID被用于版本控制。此外,异常处理也是必需的,以处理可能出现的IOExceptionClassNotFoundException

总体而言,Java的序列化提供了方便的机制,但要注意在实际使用中处理版本兼容性和安全性。在一些情况下,也可以考虑使用其他序列化框架,如JSON或XML序列化。

在这里插入图片描述

其他序列化框架扩展

除了Java的默认序列化机制外,还有其他流行的序列化框架,如JSON和XML序列化。这些框架通常用于在不同平台、不同编程语言之间进行数据交换,或者用于存储和传输数据的场景。以下是JSON和XML序列化的简要介绍:

JSON序列化

1. Jackson

  • 简介: Jackson是一个用于JSON处理的Java库,它提供了强大的序列化和反序列化功能。它支持将Java对象转换为JSON字符串,以及将JSON字符串转换为Java对象。

  • 使用示例:

    // 序列化
    ObjectMapper objectMapper = new ObjectMapper();
    String json = objectMapper.writeValueAsString(myObject);
    
    // 反序列化
    MyObject deserializedObject = objectMapper.readValue(json, MyObject.class);
    

2. Gson

  • 简介: Gson是由Google开发的一个JSON处理库,类似于Jackson。它提供了简单易用的API,支持将Java对象转换为JSON字符串,以及将JSON字符串转换为Java对象。

  • 使用示例:

    // 序列化
    Gson gson = new Gson();
    String json = gson.toJson(myObject);
    
    // 反序列化
    MyObject deserializedObject = gson.fromJson(json, MyObject.class);
    

XML序列化

1. JAXB (Java Architecture for XML Binding)

  • 简介: JAXB是Java标准库中的一个模块,用于将Java对象与XML文档之间进行映射。它通过注解或配置文件定义对象与XML元素的映射关系。

  • 使用示例:

    // 序列化
    JAXBContext context = JAXBContext.newInstance(MyObject.class);
    Marshaller marshaller = context.createMarshaller();
    marshaller.marshal(myObject, new File("myObject.xml"));
    
    // 反序列化
    Unmarshaller unmarshaller = context.createUnmarshaller();
    MyObject deserializedObject = (MyObject) unmarshaller.unmarshal(new File("myObject.xml"));
    

2. XStream

  • 简介: XStream是一个简单而灵活的XML序列化和反序列化库。它通过将Java对象直接转换为XML,而无需预定义映射关系。

  • 使用示例:

    // 序列化
    XStream xStream = new XStream();
    String xml = xStream.toXML(myObject);
    
    // 反序列化
    MyObject deserializedObject = (MyObject) xStream.fromXML(xml);
    

选择序列化框架的考虑因素

  1. 性能: 不同的框架在性能方面可能存在差异。根据应用程序的需求,选择一个性能较好的框架可能更有利。

  2. 易用性: 一些框架提供简单易用的API,而另一些可能提供更多的定制选项。根据项目的复杂性和团队的经验选择合适的框架。

  3. 支持的数据格式: 不同的框架支持不同的数据格式。例如,如果项目需要使用JSON格式,选择Jackson或Gson可能更合适。如果需要使用XML格式,JAXB或XStream可能是更好的选择。

  4. 跨语言支持: 有些框架支持多种编程语言,这对于与其他平台进行数据交换是有益的。

在实际应用中,根据项目的需求和团队的偏好,选择适当的序列化框架是很重要的。

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

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

相关文章

翻译:Building Efficient RAG Systems: A Deep Dive into devv.ai

RAG 的全称是:Retrieval Augmented Generation(检索增强生成) 最初来源于 2020 年 Facebook 的一篇论文:Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks(是的,你没有看错,…

springboot学生综合测评系统源码和论文

随着信息化时代的到来,管理系统都趋向于智能化、系统化,学生综合测评系统也不例外,但目前国内仍都使用人工管理,学校规模越来越大,同时信息量也越来越庞大,人工管理显然已无法应对时代的变化,而…

将mask的图片标签转换为yolo的txt标签

将mask的图片标签转换为yolo的txt标签 获取外轮廓 import copy import cv2 import os import shutil import numpy as nppath "你的mask路径 /Dataset/mask" files os.listdir(path) for file in files:name file.split(.)[0]file_path os.path.join(path,name.…

市场复盘总结 20240109

仅用于记录当天的市场情况,用于统计交易策略的适用情况,以便程序回测 短线核心:不参与任何级别的调整,采用龙空龙模式 昨日主题投资 连板进级率 66% 二进三: 进级率低 最常用的二种方法: 方法一&#x…

阿里巴巴秋招前端笔试题

单选题 下面的 JSX 代码中&#xff0c;哪一个无法达到预期的效果&#xff1f; A.<h2>Hello World</h2> B.<input type”checkbox”/> C.<div class”msg-box”>{msg}</div> D.<label htmlFor”name”>Leo</label> E.div styl…

编码技巧(二) element-ui table中根据状态控制是否可以勾选

项目中使用element-ui时,表格中的数据有不同的状态,需要对某个状态的数据进行 勾选操作 如图所示: 只有id为12的符合条件可以进行勾选 <el-table-column type="selection" header-align="center" :selectable="selectable" align="c…

Excel:通过excel将表数据批量转换成SQL语句

这里有一张表《student》&#xff0c;里面有10条测试数据&#xff0c;现在将这10条测试数据自动生成 insert语句&#xff0c;去数据库 批量执行 P.S. 主要用到excel表格中的 CONCATENATE函数&#xff0c;将单元格里面的内容填入到sql里面对应的位置 1. 先写好一条insert语句&a…

U盘、硬盘无法打开,修复RAW磁盘或分区,硬盘变成raw格式如何恢复,数据恢复

本文持续更新&#xff0c;针对遇到的数据丢失问题进行详细记录 磁盘变成RAW的可能原因 突然断电或关机文件系统丢失或损坏病毒或恶意软件感染坏扇区磁盘损坏 以下解决方案针对非病毒损坏 通过Windows自带的工具进行恢复&#xff08;CHKDSK命令&#xff09; 1.连接硬盘 2.…

资产信息管理系统-前后端开发

题目要求&#xff1a; 资产管理系统 利用H5规范&#xff0c;CSS样式与JS脚本独立于HTML页面&#xff0c;Javascript调用jQuery库&#xff0c;CRUD后端使用FastAPI封装&#xff0c;前端页面在Nginx中运行&#xff0c;调用API模块&#xff0c; 实现CURD的课设总结 基本设计&am…

java: 5-4 while循环 + do while循环

文章目录 1. while循环1.1 基本语法1.2 流程图1.3 上手练习1.4 细节1.5 练习题 2. do while 循环2.1 基本语法2.2 流程图2.3 上手练习2.4 细节2.5 练习题 【老韩b站视频笔记p126-p132】 1. while循环 1.1 基本语法 1.2 流程图 1.3 上手练习 输出 10 句 你好,韩顺平教育。 pu…

MySQL之导入导出远程备份(详细讲解)

文章目录 一、Navicat导入导出二、mysqldump命令导入导出2.1导出2.2导入&#xff08;使用mysqldump导入 包含t_log表的整个数据库&#xff09; 三、LOAD DATA INFILE命令导入导出3.1设置;3.2导出3.3导入(使用单表数据导入load data infile的方式) 四、远程备份4.1导出4.2导入 一…

一个大场景下无线通信仿真架构思路(对比omnet与训练靶场)

2020年分析过omnet的源码&#xff0c;读了整整一年&#xff0c;读完之后收获不小&#xff0c;但是也遗憾的发现这个东西只适合实验室做研究的人用于协议的研发与测试&#xff0c;并不适合大场景&#xff08;军事游戏等&#xff09;的应用&#xff0c;因为其固有架构更侧重于每个…

国产系统-银河麒麟桌面版安装wps

0安装版本 系统版本 版本名称:银河麒麟桌面版操作系统V10(SP1) 软件版本 wps个人版2019 1双击安装 1.1卸载自带wps 为什么要卸载没有序列号,授权过期,不是免费的,通过先安装/在升级个人版跳过输入序列号问题等等原因 1.1.1当前自带的wps版本 1.1.2卸载 不卸载无法安装在…

盖子的c++小课堂——第二十三讲:背包问题

前言 又是一次漫长的更新&#xff08;我真不是故意的aaaaaaaaaaaaaaa&#xff09;&#xff0c;先不多说了&#xff0c;直接给我~坐下~说错了说错了&#xff0c;直接开始~ 背包问题----动态规划 背包问题&#xff08;knapsack problem&#xff09; 动态规划&#xff08;dyna…

2024年中国电子学会青少年编程等级考试安排的通知

各有关单位、全体考生: 中国电子学会青少年等级考试&#xff08;以下简称等级考试&#xff09;是中国电子学会为落实《全民科学素质行动规划纲要》&#xff0c;提升青少年电子信息科学素质水平而开展的社会化评价项目。等级考试自2011年启动以来&#xff0c;作为中国电子学会科…

【野火i.MX6ULL开发板】在MobaXterm平台利用Type-C线串口连接开发板

0、前言 参考文献&#xff1a; http://t.csdnimg.cn/9iRTm http://t.csdnimg.cn/Z0n60 问题&#xff1a;一直识别不出com口&#xff0c; 拟解决思路&#xff1a; 百度网盘重新下载Debian镜像&#xff0c;烧入full版镜像&#xff0c;随便换一下USB插口&#xff08;电脑主机上…

SpringBoot 注解超全详解

使用注解的优势&#xff1a; 采用纯java代码&#xff0c;不在需要配置繁杂的xml文件 在配置中也可享受面向对象带来的好处 类型安全对重构可以提供良好的支持 减少复杂配置文件的同时亦能享受到springIoC容器提供的功能 1 注解详解&#xff08;配备了完善的释义&#xff0…

探索人工智能:深度学习、人工智能安全和人工智能

深度学习是人工智能的一种重要技术&#xff0c;它模拟了人类大脑神经网络的工作原理&#xff0c;通过建立多层次的神经元网络来实现对数据的分析和处理。这种技术的引入使得人工智能的发展进入到了一个新的阶段。 现如今&#xff0c;深度学习在各个领域都有着广泛的应用。例如…

数据库的导入导出以及备份

1.数据库的导出和导入 一.navicat导入导出 导入&#xff1a;右键➡运行SQL文件 导出选&#xff1a;中要导出的表➡右键➡转储SQL文件➡数据和结构 mysqldump命 1. 进入navicat安装目录的bin目录&#xff0c;cmd打开命令窗口 2. mysql -u用户名 -p ➡ 输入密码 3. creat…

Python学习笔记-使用Anaconda+VSCode配置开发环境

文章目录 概述一、安装Anaconda1.1 下载软件1.2 安装anaconda1.3 配置环境 二、配置虚拟环境2.1 使用conda创建一个新的虚拟环境2.1.1 使用search指令查看支持的python的版本&#xff1a;2.1.2 使用create创建指定版本的虚拟环境&#xff1a;2.1.3 使用env list查看虚拟环境列表…