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.rhkb.cn/news/235108.html

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

相关文章

HTTP 代理原理及实现(二)

在上篇《HTTP 代理原理及实现(一)》里,我介绍了 HTTP 代理的两种形式,并用 Node.js 实现了一个可用的普通 / 隧道代理。普通代理可以用来承载 HTTP 流量;隧道代理可以用来承载任何 TCP 流量,包括 HTTP 和 H…

加工零件的题解

目录 原题描述: 题目描述 输入格式 输出格式 样例 #1 样例输入 #1 样例输出 #1 样例 #2 样例输入 #2 样例输出 #2 提示 题目大意: 主要思路: 但是我们怎么才能判断出x走到1时L是偶数还是奇数呢? 初始化:…

UML期末复习(带习题,选择题,判断题)(持续更新)

UML期末复习 UML简介UML模型图的构成UML事物UML包含4种事物:构件事物: UML模型的静态部分,描述概念或物理元素行为事物:UML模型图的动态部分,描述跨越空间和时间的行为分组事物: UML模型图的组织部分&#…

24/1/10 qt work

1. 完善对话框,点击登录对话框,如果账号和密码匹配,则弹出信息对话框,给出提示”登录成功“,提供一个Ok按钮,用户点击Ok后,关闭登录界面,跳转到其他界面 如果账号和密码不匹配&…

麻雀搜索算法SSA预告

麻雀搜索算法(Sparrow Search Algorithm,SSA)是一种模拟麻雀觅食行为的优化算法,由Ahmed K. Attiya在2018年提出。该算法通过模拟麻雀在觅食时的群体协作行为,以解决优化问题。 以下是麻雀搜索算法的基本原理&#xf…

Qt QCheckBox复选按钮控件

文章目录 1 属性和方法1.1 文本1.2 三态1.3 自动排他1.4 信号和槽 2 实例2.1 布局2.2 代码实现 Qt中的复选按钮类是QCheckBox它和单选按钮很相似,单选按钮常用在“多选一”的场景,而复选按钮常用在"多选多"的场景比如喜欢的水果选项中&#xf…

【C++期末编程题题库】代码+详解18道

适合期末复习c看,或者刚入门c的小白看,有的题会补充知识点,期末复习题的代码一般比较简单,所以语法上没那么严谨。本文所有题目要求全在代码块的最上面。 目录 1、设计复数类 2、设计Computer类 3、实现相加的函数模板 4、圆类…

three.js实现电子围栏效果(纹理贴图)

three.js实现电子围栏效果&#xff08;纹理贴图&#xff09; 实现步骤 围栏的坐标坐标转换为几何体顶点&#xff0c;uv顶点坐标加载贴图&#xff0c;移动 图例 代码 <template><div class"app"><div ref"canvesRef" class"canvas-…

开关电源PFC电路原理详解及matlab仿真

PFC全称“Power Factor Correction”&#xff0c;意为“功率因数校正”。PFC电路即能对功率因数进行校正&#xff0c;或者说能提高功率因数的电路。是开关电源中很常见的电路。 在电学中&#xff0c;功率因数PF指有功功率P&#xff08;单位w&#xff09;与视在功率S&#xff08…

websocket介绍并模拟股票数据推流

Websockt概念 Websockt是一种网络通信协议&#xff0c;允许客户端和服务器双向通信。最大的特点就是允许服务器主动推送数据给客户端&#xff0c;比如股票数据在客户端实时更新&#xff0c;就能利用websocket。 Websockt和http协议一样&#xff0c;并不是设置在linux内核中&a…

【昕宝爸爸定制】如何将集合变成线程安全的?

如何将集合变成线程安全的? ✅典型解析&#x1f7e2;拓展知识仓☑️Java中都有哪些线程安全的集合&#xff1f;&#x1f7e0;线程安全集合类的优缺点是什么&#x1f7e1;如何选择合适的线程安全集合类☑️如何解决线程安全集合类并发冲突问题✔️乐观锁实现方式 (具体步骤)。✅…

Kubernetes实战(十五)-Pod垂直自动伸缩VPA实战

1 介绍 VPA 全称 Vertical Pod Autoscaler&#xff0c;即垂直 Pod 自动扩缩容&#xff0c;它根据容器资源使用率自动设置 CPU 和 内存 的requests&#xff0c;从而允许在节点上进行适当的调度&#xff0c;以便为每个 Pod 提供适当的资源。 它既可以缩小过度请求资源的容器&…

Oracle regexp_substr

select regexp_substr(123|456|789, [^|], 1, 2) from dual;

C练习——N个水手分椰子

题目&#xff1a; 五个水手在岛上发现一堆椰子&#xff0c;先由第1个水手把椰子分为等量的5堆&#xff0c;还剩下1个给了猴子&#xff0c;自己藏起1堆。然后&#xff0c;第2个水手把剩下的4堆混合后重新分为等量的5堆&#xff0c;还剩下1个给了猴子&#xff0c;自己藏起1堆。以…

uniapp 解决安卓App使用uni.requestPayment实现沙箱环境支付宝支付报错

背景&#xff1a;uniapp与Java实现的安卓端app支付宝支付&#xff0c;本想先在沙箱测试环境测支付&#xff0c;但一直提示“商家订单参数异常&#xff0c;请重新发起付款。”&#xff0c;接着报错信息就是&#xff1a;{ "errMsg": "requestPayment:fail [pa…

常用注解/代码解释(仅个人使用)

目录 第一章、代码解释①trim() 方法以及(Arrays.asList(str.split(reg)));②查询字典项②构建后端镜像shell命令解释 第二章、注解解释①PropertySource注解与Configurationproperties注解的区别 第三章、小知识①Linux系统中使用$符号表示变量 友情提醒: 先看文章目录&#…

设计模式篇章(3)——七种结构型模式

结构型设计模式主要思考的是如何将对象进行合理的布局来组成一个更大的功能体或者结构体&#xff0c;这个现在讲有点抽象&#xff0c;用大白话讲就是利用现有的对象进行组合或者配合&#xff0c;使得组合后的这个系统更加好。好是相对于不使用设计模式&#xff0c;按照自己的堆…

固定翼仿真的切换

delta固定翼飞行器模型 接着这篇文章文章链接&#xff0c;我们对飞行器模型进行改进&#xff0c; 我们知道&#xff0c;我们打开仿真模型 gazebo --verbose zephyr_ardupilot_demo.world 我们注意这最后一个语句 <model name"zephyr_delta_wing_demo">//加载z…

Cesium自定义电子围栏特效材质

1.new Cesium.Viewer中添加 requestWebgl1: true, 2. 编写材质&#xff0c;主要分三步 &#xff08;1&#xff09;定义MaterialProperty &#xff08;2&#xff09;设置材质 &#xff08;3&#xff09;添加材质 DynamicWallMaterial.js //定义材质对象及变量 function Dy…

IIS+SDK+VS2010+SP1+SQL server2012全套工具包及安装教程

前言 今天花了两个半小时安装这一整套配置&#xff0c;这个文章的目标是将安装时间缩短到1个小时 正文 安装步骤如下&#xff1a; VS2010 —> service pack 1 —>SQL server2012 —> IIS —> SDK 工具包链接如下&#xff1a; https://pan.baidu.com/s/1WQD-KfiUW…