Java中的序列化方法探索

.为什么要序列化

对象不序列化,能直接存储吗?
在 Java 中,序列化是将对象的状态信息转换为可以存储或传输的形式(例如,转换为字节流)的过程。在对象数据需要在网络上传输或需要在磁盘上持久化存储时,序列化是必不可少的
对象在没有序列化的情况下不能直接存储在像文件系统或数据库这样的持久化存储中。序列化是将对象的状态转换为一种可以存储或传输的格式的过程。
没有序列化,对象是一个内存中的数据结构,不能直接存储到硬盘或通过网络传输。如果要持久化存储或在网络间传输一个对象,您需要先将其序列化为如二进制、JSON、XML 等格式。
这些格式可以被写入文件系统、数据库或通过网络发送,并在需要时反序列化回原始对象。

java中的序列化几种形式

Java 原生序列化:通过实现 java.io.Serializable 接口。对象被转换成二进制流以便于存储或传输。
JSON 序列化:使用库如 Jackson 或 Gson,将对象转换为 JSON 格式的字符串。
XML 序列化:使用如 JAXB (Java Architecture for XML Binding) 等库将对象转换为 XML 格式。
Google Protocol Buffers:一种语言和平台无关的高效二进制序列化库。
Apache Avro:支持丰富的数据结构的数据序列化系统。
Kryo:一个快速高效的 Java 二进制序列化和反序列化库。

以下以Serializable 和 JSON做分析

java 原生的序列化机制Serializable

在 Java 中,可以通过 原生的序列化机制。实现 java.io.Serializable 接口来启用对象的序列化。这个接口是一个标记接口,它不包含任何方法,仅标记类的对象可以被序列化。
版本兼容性:如果序列化的对象在不同版本之间发生变化,可能会遇到兼容性问题。为此,可以使用 serialVersionUID 来管理版本。
transient 关键字:如果您的类中有一些不需要序列化的字段(无论是 String 类型还是其他类型),可以使用 transient 关键字标记这些字段。
private int myInt; // 基本类型 int
在 Java 中,基本数据类型(如 int、double、boolean 等)本身并不实现 Serializable 接口,因为它们不是对象。但是,当基本数据类型被用作类的字段时,在该类实现了 Serializable 接口的情况下,这些基本数据类型的字段会自动包含在序列化过程中。
这意味着,如果您创建了一个实现了 Serializable 接口的类,并且这个类包含基本数据类型的字段,那么当您序列化这个类的对象时,这些基本数据类型的字段也会被序列
通常Serializable 序列化会有乱码
序列化过程生成的二进制数据不仅包含字符串的内容,还包含了 Java 对象序列化的附加信息,如类信息、序列化版本 ID 等。
这部分数据在文本编辑器中通常显示为乱码,因为它们包含非文本字符
Serializable序列化的的二进制,查看可以用二进制编辑器查看,不过可是不可识别的字符
(Notepad++ 安装插件 HEX-Editor 8.5.3Notepad++ 下载0.9.12 HEX-Editor)
在这里插入图片描述

测试 HashMap序列化与反序列化

package com.example.demo;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.HashMap;

public class SerializeExample {
public static void main(String[] args) {
String str = “Hello, World!”; // 字符串对象
try {
// 创建一个指向文件的输出流
FileOutputStream fileOut = new FileOutputStream(“D:\file.bin”);
// 创建一个对象输出流,并将其包装在 fileOut 流中
ObjectOutputStream out = new ObjectOutputStream(fileOut);
HashMap<String, String> hashMap = new HashMap<>();
hashMap.put(“key”,“111”);
// 序列化字符串对象
out.writeObject(hashMap);

        // 关闭所有流out.close();fileOut.close();System.out.println("Serialized data is saved in string.ser");} catch (IOException i) {i.printStackTrace();}
}

}

package com.example.demo;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.HashMap;

public class DeserializeExample {
public static void main(String[] args) {
HashMap<String,String> str = new HashMap();
try {
// 创建一个指向文件的输入流
FileInputStream fileIn = new FileInputStream(“D:\file.bin”);
// 创建一个对象输入流,并将其包装在 fileIn 流中
ObjectInputStream in = new ObjectInputStream(fileIn);

        // 反序列化字符串对象  反序列化时使用 ObjectInputStream 读取序列化的对象数据,会返回一个 Object 类型的实例。如果您知道该对象的具体类型,通常需要进行显式的类型转换(强转)以恢复到其原始类型。str = (HashMap<String, String>) in.readObject();str.forEach((k,v)->{System.out.println(k+"        "+v);});// 关闭所有流in.close();fileIn.close();System.out.println("Deserialized String: " + str);} catch (IOException i) {i.printStackTrace();return;} catch (ClassNotFoundException c) {System.out.println("String class not found");c.printStackTrace();return;}
}

}

二:JSON序列化

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式(一种格式)。JSON 使用文本格式来表示对象,使其网络上进行数据传输,被绝大多数编程语言解析。
普通文本对象打印为:对象信息,别人无法识别
package com.example.demo;

import com.alibaba.fastjson.JSON;
import java.io.FileWriter;
import java.io.IOException;

public class JsonToFileExample {

public static void main(String[] args) {// 创建要序列化的对象MyObject obj = new MyObject();obj.setName("Example Name");obj.setValue(123);// 使用 Fastjson 将对象转换为 JSON 字符串

// String jsonString = JSON.toJSONString(obj);

    // 将 JSON 字符串保存到文件try (FileWriter file = new FileWriter("D:\\object.txt")) {file.write(obj.toString());file.flush();} catch (IOException e) {e.printStackTrace();}
}static class MyObject {private String name;private int value;// getters 和 setterspublic String getName() {return name;}public void setName(String name) {this.name = name;}public int getValue() {return value;}public void setValue(int value) {this.value = value;}
}

}
在这里插入图片描述
如果转成json则可以打印为:
public class JsonToFileExample {

public static void main(String[] args) {// 创建要序列化的对象MyObject obj = new MyObject();obj.setName("Example Name");obj.setValue(123);// 使用 Fastjson 将对象转换为 JSON 字符串String jsonString = JSON.toJSONString(obj);// 将 JSON 字符串保存到文件try (FileWriter file = new FileWriter("D:\\object.txt")) {file.write(jsonString);file.flush();} catch (IOException e) {e.printStackTrace();}
}static class MyObject {private String name;private int value;// getters 和 setterspublic String getName() {return name;}public void setName(String name) {this.name = name;}public int getValue() {return value;}public void setValue(int value) {this.value = value;}
}

在这里插入图片描述

在 Spring Boot 项目中,使用 Feign 进行远程调用时,对象的传输通常不依赖于 Java 的原生序列化机制(即实现 Serializable 接口)。
Feign 和其他 Spring Cloud 组件在进行远程调用时,会使用 HTTP 协议,并且通常结合了如 JSON 或 XML 等格式的 HTTP 消息转换器来序列化和反序列化对象。
当一个服务调用另一个服务时,Feign 客户端会将 Java 对象转换为 JSON(或其他格式),然后通过 HTTP 请求发送。接收方的服务会将这些 JSON 数据反序列化回 Java 对象。这个过程并不要求 Java 对象实现 Serializable 接口,因为它是基于 HTTP 和消息转换器(如 Jackson JSON 处理库),而不是 Java 原生的序列化机制。
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它可以用于数据的传输和转换。JSON 在不同语言和平台之间传输数据时特别有用,因为它易于人阅读和编写,同时也易于机器解析和生成。在许多现代编程环境和网络应用中,JSON 被广泛用于前后端之间的数据传递,以及不同系统之间的数据交换。JSON 格式因其文本形式和自描述性,成为了 Web API 和微服务架构中常用的数据格式。
序列化不一定需要通过实现 Java 的 Serializable 接口来完成。将对象转换成 JSON、XML 或其他格式也是一种序列化的方法。这些方法允许您将对象的状态转换成一种可以存储或传输的格式,而不依赖于 Java 内置的序列化机制。JSON 和 XML 序列化的优点是它们更加灵活,并且与使用不同编程语言的系统之间的兼容性更好。
换成 JSONObject 通常不会携带有关对象原始类的详细信息,例如类名或属性的数据类型。JSONObject 主要是一种以键值对形式存储数据的结构,其中键通常是字符串,对应对象的字段名称,值是字段的值。这意味着对象的结构会被保留,但不包括其作为特定类实例的信息。当从 JSONObject 反序列化时,您需要知道要将其转换成哪种具体的类类型。虽然 JSON 序列化产生的是文本数据,但这些文本数据最终在存储或传输时仍然以二进制的形式存在(因为所有的文件和网络数据传输本质上都是二进制的)。
在 Spring Boot 应用中,当在 Controller 层将对象转换为 JSON 时,通常这是通过使用 Spring MVC 框架的内置功能自动完成的。这里是一个简单的例子:
@RestController 注解表明这个类是一个 Spring MVC Controller,并且所有的响应都会自动转换成 JSON。
ResponseEntity 用于包装响应对象,Spring MVC 会自动使用 Jackson 或其他配置的 JSON 转换库将 MyObject 实例转换成 JSON 格式。
当客户端请求 /myendpoint 时,方法 getMyObject() 会被调用,返回的 MyObject 对象将被自动序列化为 JSON。

在这段 Spring Boot 控制器代码中,序列化主要发生在将 Java 对象转换为 HTTP 响应的 JSON 数据时。这是由 Spring MVC 框架自动处理的。
Spring Boot 应用中,当您的控制器方法返回一个对象时,Spring MVC 使用配置的消息转换器(默认是 Jackson)将对象转换为 JSON 格式。这个过程与对象是否实现 Serializable 无关。
在 Spring MVC 框架中,对象到 JSON 的自动转换是由 HttpMessageConverter 接口的实现类处理的。具体来说:
MappingJackson2HttpMessageConverter:
这是最常用的转换器,用于处理 JSON 数据。它使用 Jackson 库将 Java 对象转换为 JSON,以及将 JSON 转换为 Java 对象。

配置:
在 Spring MVC 中,这些转换器通常是自动配置的。您可以通过配置 WebMvcConfigurer 来自定义这些转换器的行为。
当一个控制器方法返回对象时,Spring MVC 框架会使用合适的 HttpMessageConverter(如 MappingJackson2HttpMessageConverter)来将对象转换为相应格式的响应体(在大多数情况下是 JSON)。
在 Spring MVC 中,以下几个因素通常指示框架自动处理对象到 JSON 的转换:
@RestController 注解:这个注解表明类中的所有方法返回值都应被视为响应体,并且默认会转换为 JSON。
@ResponseBody 注解:在一个使用 @Controller 注解的类中,@ResponseBody 可以用于具体的方法上,表示该方法的返回结果应该被转换为响应体。
内容协商:Spring MVC 根据请求头(如 Accept)进行内容协商,确定使用哪种格式的响应。
配置的消息转换器:如果项目中配置了 MappingJackson2HttpMessageConverter(默认情况下是有的),它会自动用于转换 JSON。
返回类型:方法的返回类型通常是一个 POJO(普通的 Java 对象),Spring MVC 会尝试将其序列化为 JSON。

HTTP(超文本传输协议)可以传输多种类型的数据,包括但不限于:

文本数据:如 HTML 页面、JSON 或 XML 数据、普通文本等。
数字:作为文本的一部分传输,如查询参数或 JSON/XML 的一部分。
图像和多媒体:如 JPEG、PNG 图像,MP3 音频,MP4 视频等。
二进制数据:任何形式的文件数据,如文档、压缩文件等。
表单数据:通过表单提交的数据,包括文本字段、数字、文件上传等。
所以他可以传递string类型(普通文本) 数字,json等,但是不能传递java对象

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

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

相关文章

指针的含义、表示、规范、存储、运用

指针的含义、表示、规范、存储、运用 指针的含义指针的表示指针的规范先声明再定义声明和定义一起表示错误表示 指针的存储理解一个变量的存储过程和原理理解一个指针的存储过程和原理理解多个指针的存储过程和原理 指针的运用 指针的含义 表示某个变量或数据所在的内存地址 注…

使用tailscale访问对端局域网上的其他设备

当tailscale客户端应用程序直接安装在组织中的每个客户端、服务器和虚拟机上时&#xff0c;Tailscale 效果最佳。这样&#xff0c;流量就会被端到端加密&#xff0c;并且无需配置即可在物理位置之间移动机器。 但是&#xff0c;在某些情况下&#xff0c;你不能或不想在每台设备…

Linux第18步_安装“Ubuntu系统下的C语言编GCC译器”

Ubuntu系统没有提供C/C的编译环境&#xff0c;因此还需要手动安装build-essential软件包&#xff0c;它包含了 GNU 编辑器&#xff0c;GNU 调试器&#xff0c;和其他编译软件所必需的开发库和工具。本节用于重点介绍安装“Ubuntu系统下的C语言编译器GCC”和使用。 1、在安装前…

图片纹理贴图

/* * 当需要给图形赋予真实颜色的时候&#xff0c;不太可能为没一个顶点指定一个颜色&#xff0c;通常会采用纹理贴图 * 每个顶点关联一个纹理坐标 (Texture Coordinate) 其它片段上进行片段插值 * */#include <iostream> #define STBI_NO_SIMD #define STB_IMAGE_IMPLE…

【嵌入式移植】1、Ubuntu系统准备

Ubuntu系统准备 虚拟机与Ubuntu安装下载Ubuntu创建虚拟机系统配置 虚拟机与Ubuntu安装 嵌入式移植通常使用Linux操作系统的环境&#xff0c;使用Linux下的交叉编译工具链对BootLoader、kernel以及应用程序进行编译&#xff0c;然后下载运行。当然也可以通过各类IDE或者Windows…

从文本(.txt)文件中读取数据时出现中文乱码

前言 当需要从记事本中读取数据时&#xff0c;发现读取的数据会出现中文乱码&#xff0c;我尝试了C和C读取文件&#xff0c;发现都是这样。 乱码原因 文本文件的保存默认使用UTF-8编码方式&#xff0c;而VS编译器的编码方式是GBK&#xff0c;所以不同的编码方式导致了乱码。…

【leetcode】力扣算法之删除链表中倒数第n个节点【中等难度】

删除链表中倒数第n个节点 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 用例 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5] 输入&#xff1a;head [1], n 1 输出&#xff1a;[] 输入&#xff1a;head …

各种锁的概述

乐观锁与悲观锁 悲观锁指对数据被外界修改持保守态度&#xff0c;认为数据很容易就会被其他线程修改&#xff0c;所以在数据被处理前先对数据进行加锁&#xff0c;并在整个数据处理过程中&#xff0c;使数据处于锁定状态。 悲观锁的实现往往依靠数据库提供的锁机制&#xff0…

计算机体系结构期末复习流程大纲

1.存储器和cache 存储器的容量、速度与价格之间的要求是相互矛盾的&#xff0c;速度越快&#xff0c;没bit位价格越高&#xff0c;容量越大&#xff0c;速度越慢&#xff0c;目前主存一般有DRAM构成。 处理器CPU访问存储器的指标&#xff1a; 延迟时间&#xff08;Latency&am…

【C++】—— 工厂模式详解

目录 &#xff08;一&#xff09;工厂模式的特点 &#xff08;二&#xff09;工厂模式分类 1、简单工厂模式 2、工厂方法模式 3、抽象工厂模式 &#xff08;三&#xff09;总结与回顾 &#xff08;一&#xff09;工厂模式的特点 1、优势 ⼯⼚模式是⼀种创建型设计模式&a…

快速入门Visual Studio 2022开发.Net Framework研发环境指南

IDE工具 Visual Studio 2022 Vs2022企业版 - VisualStudioSetup.exe Visual Studio Code VSCodeUserSetup-x64-1.66.2.exeVSCodeUserSetup-x64-1.67.0-insider.exe IDE环境 编程字体YaHei.Consolas YaHei.Consolas.1.12.ttf IDE插件 Visual Studio Code常用插件 Chinese…

django项目基础后端功能使用

参考材料 Django新手项目实例-CSDN博客 一、django安装 pip3 install django 二、django项目新建 在目标目下执行 django-admin startproject testdjgo 执行完成后生成对应项目路径 三、django路由功能编写 /xxx/urls.py中编写路由信息&#xff0c;并且把路由转发到对应…

说出来你别不信,盲订问界M9的原因 你们想错了,他们只图这个

文|AUTO芯球 作者|李瑞 怎么还有人说华为是骗子&#xff1f; 华为一张海报说问界M9上市6天&#xff0c;大定超过3万台。有些人就说这是假的&#xff0c;反正没第三方数据&#xff0c;华为可以随便写。 我去&#xff0c;我作为一名大定问界M9的车主&#xff0c;就奉劝哪些黑子…

5.vue学习笔记(数组变化的侦测+计算属性+Class绑定)

文章目录 1.数组变化的侦测1.1.变更方法1.2.替换一个数组 2.计算属性计算属性缓存vs方法 3.Class绑定3.1.绑定对象3.2.多个对象的绑定形式3.3.绑定数组3.4.数组与对象 1.数组变化的侦测 1.1.变更方法 vue能够侦听响应式数组的变更方法&#xff0c;并在它们被调用时出发相关的…

Taro+vue3 实现电影切换列表

1.需求 我们在做类似于猫眼电影的小程序或者H5 的时候 我们会做到那种 左右滑动的电影列表&#xff0c;这种列表一般带有电影场次 2.效果 3.说明 这种效果在淘票票 猫眼电影上 都有的 &#xff0c;一般电影类型的H5 或者小程序 这个是都有的 第一是好看 第二是客观性比较好 …

Mysql InnoDB行锁深入理解

Record Lock记录锁 Record Lock 称为记录锁&#xff0c;锁住的是一条记录。而且记录锁是有 S 锁和 X 锁之分的&#xff1a; 当一个事务对一条记录加了 S 型记录锁后&#xff0c;其他事务也可以继续对该记录加 S 型记录锁&#xff08;S 型与 S 锁兼容&#xff09;&#xff0c;…

物联网与智能家居:跨境电商与未来生活的融合

物联网&#xff08;Internet of Things&#xff0c;IoT&#xff09;和智能家居技术正迅速崛起&#xff0c;成为跨境电商领域的创新引擎。这两者的巧妙结合不仅为消费者提供更智能、便捷的生活方式&#xff0c;同时也为电商平台和制造商带来了全新的商机。本文将深入探讨物联网与…

C++模板——(3)类模板

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 勤奋&#xff0c;机会&#xff0c;乐观…

使用pyinstaller打包生成exe(解决gradio程序的打包问题)

解决 [Errno 2] No such file or directory: gradio_client\types.json 问题&#xff0c;不需要手动创建hook文件 解决 FileNotFoundError: [Errno 2] No such file or directory: gradio\blocks_events.pyc 问题&#xff0c;不需要将pyi文件重命名为pyc文件 最终实现gradio程…