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;
    }

    @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. 跨语言支持: 有些框架支持多种编程语言,这对于与其他平台进行数据交换是有益的。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

众和策略:沪指跌0.91%险守2900点,半导体、金融等板块走低

8日早盘,两市股指低开低走,沪指一度失守2900点,深成指、创业板指跌约1%,科创50指数创前史新低。 到午间收盘,沪指跌0.91%报2902.4点,深成指跌1.17%,创业板指跌0.99%,科创50指数跌超…

唠一唠Java线程池

第1章:引言 大家好,我是小黑,咱们今天来聊聊Java线程池,如果没有线程池,每个线程都需要手动创建和销毁线程,那将是多么低效和耗资源啊! 线程池的核心作用就是复用已创建的线程,减少…

使用电脑多年的你不可不知:移动机械硬盘的正确使用姿势

前言 随着科技的发展,小伙伴手边或多或少都有移动硬盘这个存储设备。上班族用来存储资料,家人用来存放回忆。但移动机械硬盘的使用过程中是有注意事项的,你知道多少移动机械硬盘的使用注意事项呢? 今天小白就跟各位小伙伴来唠唠…

好用的设备租赁管理软件有哪些?

“我们公司是做设备租赁的,想找一款适合设备租赁的库存管理软件,最好有库存管理,客户信息,设备外调管理,租赁天数管理,设备的借出与归还信息管理与查询。” 总结一下—— 库存管理客户信息管理设备租赁管…

softmax详解

在神经网络中,Softmax 是一个用于多类别分类的激活函数。给定一个包含原始分数(未经处理的模型输出)的向量,Softmax 将这些分数转化为表示概率分布的向量。具体而言,对于给定的原始分数向量 ( z ),Softmax …

Transformers 2023年度回顾 :从BERT到GPT4

人工智能已成为近年来最受关注的话题之一,由于神经网络的发展,曾经被认为纯粹是科幻小说中的服务现在正在成为现实。从对话代理到媒体内容生成,人工智能正在改变我们与技术互动的方式。特别是机器学习 (ML) 模型在自然语言处理 (NLP) 领域取得…

《网络是怎样连接的》2.5节图表(自用)

图5.1:ip包结构 图5.2:ip网络包的传输方式 1.以太网的部分也可以替换成其他的东西,例如无线局域网、ADSL、FTTH等,它们都可以替代以太网的角色帮助IP协议来传输网络包 2.根据ARP协议,客户端可以根据ip地址得到下一个路…

vsCode输出控制台中文乱码解决

在tasks.json里的args中添加 "-fexec-charsetGBK", // 处理mingw中文编码问题 "-finput-charsetUTF-8",// 处理mingw中文编码问题

VMware Workstation安装以及配置模板机

文章目录 一、VMware Workstation软件下载安装1、下载2、安装 二、CentOS7模板机安装1、创建虚拟机2、安装系统 三、网络配置 一、VMware Workstation软件下载安装 1、下载 下载地址:https://download3.vmware.com/software/wkst/file/VMware-workstation-full-15…

[Vulnhub靶机] DriftingBlues: 5

[Vulnhub靶机] DriftingBlues: 5靶机渗透思路及方法(个人分享) 靶机下载地址: https://download.vulnhub.com/driftingblues/driftingblues5_vh.ova 靶机地址:192.168.67.24 攻击机地址:192.168.67.3 一、信息收集 …

C#高级语法 Attribute特性详解和类型,方法,变量附加特性讲解

文章目录 前言相关资料Attribute特性个人原理理解特性的声明与使用类型特性运行结果: 找到类的Attribute属性方法特性和变量特性代码封装测试类TestService1TestService2TestService3 测试代码运行结果 对封装的代码进行优化封装代码测试代码运行结果(和…

C#,入门教程(13)——字符(char)及字符串(string)的基础知识

上一篇: C#,入门教程(12)——数组及数组使用的基础知识https://blog.csdn.net/beijinghorn/article/details/123918227 字符串的使用与操作是必需掌握得滚瓜烂熟的编程技能之一!!!!! C#语言实…

POSIX API与网络协议栈

本文介绍linux中与tcp网络通信相关的POSIX API,在每次调用的时候,网络协议栈会进行的操作与记录。 POSIX API Posix API,提供了统一的接口,使程序能得以在不同的系统上运行。简单来说不同的操作系统进行同一个活动,比…

浅析ARMv8体系结构:A64指令集

文章目录 A64指令编码格式加载与存储指令寻址模式变基模式前变基模式后变基模式 PC相对地址模式 伪指令加载与存储指令的变种不同位宽的加载与存储指令多字节内存加载和存储指令基地址偏移量模式前变基模式后变基模式 跳转指令返回指令比较并跳转指令 其它指令内存独占访问指令…

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

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

增强Wi-Fi信号的10种方法,值得去尝试

Wi-Fi信号丢失,无线盲区。在一个对一些人来说,上网和呼吸一样必要的世界里,这些问题中的每一个都令人抓狂。 如果你觉得你的Wi-Fi变得迟钝,有很多工具可以用来测试你的互联网速度。你还可以尝试一些技巧来解决网络问题。然而,如果你能获得良好接收的唯一方法是站在无线路…

nginx部署前端项目自动化脚本

文章目录 配置入口服务器nginx的conf.d使用docker创建一个nginx配置自动化脚本 前言 将项目 通过nginx 部署到 新的服务器 通过nginx反向代理出去 配置入口服务器nginx的conf.d 一般在这个文件夹下 找不到使用 find / -name nginx 2>/dev/null 找到nginx 的位置如果有些没有…

PostGIS教程学习十九:基于索引的聚簇

PostGIS教程学习十九:基于索引的聚簇 数据库只能以从磁盘获取信息的速度检索信息。小型数据库将完全位于于RAM缓存(内存),并摆脱物理磁盘访问速度慢的限制。但是对于大型数据库,对物理磁盘的访问将限制数据库的信息检…

正则表达式的语法

如果要想灵活的运用正则表达式,必须了解其中各种元素字符的功能,元字符从功能上大致分为: 限定符 选择匹配符 分组组合和反向引用符 特殊字符 字符匹配符 定位符 我们先说一下元字符的转义号 元字符(Metacharacter)-转义号 \\ \\ 符号…

【Matplotlib】基础设置之图形组合07

figures, subplots, axes 和 ticks 对象 figures, axes 和 ticks 的关系 这些对象的关系可以用下面的图来表示: 示例图像: 具体结构: figure 对象 figure 对象是最外层的绘图单位,默认是以 1 开始编号(MATLAB 风格…