Java中什么序列化?

在这里插入图片描述

在这里插入图片描述

在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;}@Overridepublic 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.mzph.cn/news/609026.shtml

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

相关文章

Noisy DQN 跑 CartPole-v1

gym 0.26.1 CartPole-v1 NoisyNet DQN NoisyNet 就是把原来Linear里的w/b 换成 mu sigma * epsilon, 这是一种非常简单的方法,但是可以显著提升DQN的表现。 和之前最原始的DQN相比就是改了两个地方,一个是Linear改成了NoisyLinear,另外一个是在agent在t…

基于 SpringBoot + vue 的医院管理系统(含源码,数据库,文档)

基于 SpringBoot vue 的医院管理系统 †前后端分离思想,这个系统简直太棒了!屯 光这个系统采用了 前后端分离思想,后端使用 SpringBoot和 SpringMVC框架,让代码更高效,更易于维护。前端则使用了 vue js 和ElementU…

mybatis plus相同Id与xml配置错误时,mybatis plus解决逻辑

前言 处理做项目的问题,其中不乏奇奇怪怪的问题,其中mybatis plus的问题感觉有点隐蔽,有些是运行时出现,有些是运行到具体的逻辑触发,对于应用的状态监控提出了极大的挑战,应用的状态由健康检查接口提供&a…

Vue_00001_CLI

初始化脚手架 初始化脚手架步骤: 第一步(仅第一次执行):全局安装vue/cli。 命令:npm install -g vue/cli 第二步:切换到要创建项目的目录,然后使用命令创建项目。 命令:vue creat…

python在一个文件夹中按文件名排序,获取这一文件的下一个文件名

在Python中,您可以使用sorted()函数对文件夹内的文件进行排序,并使用os模块来遍历这些文件。获取特定文件的下一个文件名可以通过排序后的列表来查找。下面是一个简单的示例代码,展示了如何对一个文件夹中的文件按文件名进行排序,…

【基础工具篇使用】Windows环境下瑞芯微开发工具的安装和使用

文章目录 Rockchip 烧录驱动的安装Rockchip 烧录工具使用导入配置MASKROM 模式烧录LOADER 模式烧录Update.img 包的烧录 Rockchip 烧录驱动的安装 瑞芯微提供了 RKDevTool 上位机烧录工具,此工具只能在 Windows 系统下运行,运行前要先安装驱动文件 Ro…

mitmproxy代理抓包使用mock数据

第一步 安装Python环境 下载Python环境安装包https://www.python.org/getit/https://link.jianshu.com/?thttps%3A%2F%2Fwww.python.org%2Fgetit%2F (图a) 安装Python的时候勾选“Add Python 3.5 to PATH”选项(图a) 打开CMD命…

Pytest接口自动化测试框架搭建

一. 背景 Pytest目前已经成为Python系自动化测试必学必备的一个框架,网上也有很多的文章讲述相关的知识。最近自己也抽时间梳理了一份pytest接口自动化测试框架,因此准备写文章记录一下,做到尽量简单通俗易懂,当然前提是基本的py…

书生·浦语大模型实战营第二次课堂笔记

文章目录 什么是大模型?pip,conda换源模型下载 什么是大模型? 人工智能领域中参数数量巨大、拥有庞大计算能力和参数规模的模型 特点及应用: 利用大量数据进行训练拥有数十亿甚至数千亿个参数模型在各种任务重展现出惊人的性能 …

数据结构入门到入土——链表(完)LinkedList

目录 一,双向链表 1.单向链表的缺点 2.什么是双向链表? 3.自主实现双向链表 接口实现: 二,LinkedList 1.LinkedList的使用 1.1 什么是LinkedList? 1.2 LinkedList的使用 1.LinkedList的构造 2.LinkedList的…

elementUI点击el-card选中变色,且点击别的空白处不变色

1. <script>的data中添加属性&#xff1a; selectIndex: 0 2.<template>中添加el-card元素&#xff1a; click.native调用原生click方法。 click.native是在vue中&#xff0c;避免vue父模块调用成了vue成子模块中的this.emit(click, value)的方法&#xff0c;而…

Pruning Papers

[ICML 2020] Rigging the Lottery: Making All Tickets Winners 整个训练过程中mask是动态的&#xff0c;有drop和grow两步&#xff0c;drop是根据权重绝对值的大小丢弃&#xff0c;grow是根据剩下激活的权重中梯度绝对值生长没有先prune再finetune/retrain的两阶段过程 Laye…

C++-nullptr-类型推导

1、nullptr&#xff08;掌握&#xff09;&#xff08;NULL 就是0&#xff09; NULL 在源码当中就是0&#xff0c;因此可能会存在一些二义性的问题。 #include <iostream> #include <memory> using namespace std;void func(int a) {cout << "a " …

[原创][R语言]股票分析实战[9]:周内第N天转换为星期N因子

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX QQ联系: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、D…

工业异常检测AnomalyGPT-Demo试跑

写在前面&#xff1a;如果你有大的cpu和gpu可以使用&#xff0c;直接根据官方的安装说明就可以&#xff0c;如果没有&#xff0c;可以点进来试着看一下我个人的安装经验。 一、试跑环境 NVIDIA4090显卡24g,cpu内存33G&#xff0c;交换空间8g,操作系统ubuntu22.04(试跑过程cpu…

问题 F: 分巧克力

题目描述 儿童节那天有 K 位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。小明一共有 N 块巧克力&#xff0c;其中第i 块HiWi 的方格组成的长方形。 为了公平起见&#xff0c;小明需要从这 N 块巧克力中切出 K 块巧克力分给小朋友们。 切出的巧克力需要满足&am…

SEO写作:撰写在Google上排名的博客文章的13个技巧

随着排名的提高&#xff0c;您的网站可以提高其整体知名度。最终目标是通过有效的优化来推动自然流量&#xff0c;增加转化率&#xff0c;并实现业务目标。 如果你不针对搜索引擎优化你的内容&#xff0c;你的网站可能会在搜索引擎结果页面&#xff08;SERP&#xff09;上出现…

第7章-第9节-Java中的Stream流(链式调用)

1、什么是Stream流 Lambda表达式&#xff0c;基于Lambda所带来的函数式编程&#xff0c;又引入了一个全新的Stream概念&#xff0c;用于解决集合类库既有的鼻端。 2、案例 假设现在有一个需求&#xff0c; 将list集合中姓张的元素过滤到一个新的集合中&#xff1b;然后将过滤…

Realm Management Extension领域管理扩展简介

本博客介绍了领域管理扩展(RME),这是Arm的架构扩展。RME是Arm机密计算架构(Arm CCA)的硬件组件,同时包括软件元素。RME动态地将资源和内存转移到新的受保护的地址空间,高特权软件或TrustZone固件无法访问。由于存在这个地址空间,Arm CCA构建了受保护的执行环境,称为领…

详解Oracle数据库的启动

Oracle数据库的启动&#xff0c;其概念可参考Overview of Instance and Database Startup。 其过程可参见下图&#xff1a; 当数据库从关闭状态进入打开数据库状态时&#xff0c;它会经历以下阶段。 阶段Mount状态描述1实例在没有挂载数据库的情况下启动实例已启动&#xff…