【Web】关于Java反序列化那些实现机制的朴素通识

目录

原生⚔ 自定义

基于 Java 原生序列化机制:

基于自定义序列化机制:

基于Bean⚔基于Field

基于 Bean 的反序列化:

基于 Field 的反序列化:

常见序列化协议归类


原生⚔ 自定义

基于 Java 原生序列化机制:

  • 特点
    1. 使用 Java 原生序列化机制,对象需要实现 java.io.Serializable 接口。
    2. 序列化采用 ObjectOutputStream,反序列化采用 ObjectInputStream
    3. 简单易用,无需额外的序列化和反序列化代码。
    4. 默认支持复杂对象图的序列化和反序列化,但对版本兼容性有一定限制。

基于自定义序列化机制:

  • 特点
    1. 使用非 Java 原生的序列化格式,如 JSON、XML 等。
    2. 需要使用第三方库或框架来实现自定义序列化和反序列化逻辑,如 Jackson、Gson 等。
    3. 序列化格式通常更紧凑、可读性好,支持跨语言、跨平台的数据交互。
    4. 可以更灵活地处理复杂对象结构、版本变更等问题,提供更好的兼容性和扩展性。

 

基于Bean⚔基于Field

基于 Bean 的反序列化:

如:SnakeYAML、jYAML、YamlBeans、Apache Flex BlazeDS、Red5 IO AMF、Jackson、Castor、Java XMLDecoder

  1. 原理

    • 基于 Bean 的反序列化是通过对象的 getter 和 setter 方法来读取和设置对象的属性值。在反序列化过程中,会根据属性名调用相应的 setter 方法为对象的属性赋值。
  2. 优点

    • 封装性好:使用 getter 和 setter 方法可以隐藏对象的内部实现细节,提供统一的访问接口。
    • 安全性高:可以通过控制 setter 方法来对属性值进行校验和处理,增强安全性。
  3. 缺点

    • 反序列化过程受限:需要保证类中存在对应的 setter 方法才能正确反序列化对象。
    • 可能影响性能:频繁调用 getter 和 setter 方法可能影响性能,特别是在大量对象的反序列化过程中。

基于 Field 的反序列化:

如:Java Serialization、Kryo、Hessian、json-io、XStream

 

  1. 原理

    • 基于 Field 的反序列化直接操作对象的字段(Field),不通过 getter 和 setter 方法。在反序列化过程中,会直接操作对象的字段来设置属性的值。
  2. 优点

    • 灵活性高:可以直接访问对象的字段,无需依赖 getter 和 setter 方法。
    • 性能较好:直接操作字段可能比通过方法调用更高效。
  3. 缺点

    • 破坏封装性:直接操作字段可能破坏对象的封装性,暴露对象的内部实现细节。
    • 安全风险:绕过 setter 方法可能导致属性值未经校验,存在安全风险。

常见序列化协议归类

序列化协议

特点

jdk
(jdk 自带)

1. 序列化:除了 static、transient类型
2. 特点:强类型,安全性高,序列化结果携带类型信息
3. 反序列化:基于 Field 机制
4. 应用场景:深拷贝

fastjson
(第三方实现)

1. 可读性好,空间占用小
2. 特点:弱类型,序列化结果不携带类型信息,可读性强。有一些安全性问题
3. 反序列化:基于 Field 机制,兼容 Bean 机制
4. 应用场景:消息、透传对象

hessian
(第三方实现)

1. 序列化:除了 static、transient 类型
2. 特点:强类型,体积小,可跨语言,序列化结果携带类型信息
3. 反序列化:基于 Field 机制,兼容 Bean 机制
4. 应用场景:RPC

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

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

相关文章

Android14 Handle机制

Handle是进程内部, 线程之间的通信机制. handle主要接受子线程发送的数据, 并用此数据配合主线程更新UI handle可以分发Message对象和Runnable对象到主线程中, 每个handle实例, 都会绑定到创建他的线程中, 它有两个作用,: (1) 安排消息在某个主线程中某个地方执行 (2) 安排…

Python学习之基础语法

一、HelloWorld 二、Python基础语法 2.1 字面量 定义:在代码中,被写下来的固定的值,称之为字面量。 常用的6种值的类型 字符串 Python中,字符串需要用双引号包围; 被双引号包围的都是字符串 666 13.14 "黑马…

深度学习预备知识(线性代数)

介绍: 深度学习是一种机器学习的方法,涉及到大量的线性代数运算。线性代数是研究向量空间和线性映射的数学学科。在深度学习中,线性代数常用于表示和处理输入数据和模型参数。下面是一些深度学习中常见的线性代数概念和运算: 1. …

数据结构之单链表及其实现!

目录 ​编辑 1. 顺序表的问题及思考 2.链表的概念结构和分类 2.1 概念及结构 2.2 分类 3. 单链表的实现 3.1 新节点的创建 3.2 打印单链表 3.3 头插 3.4 头删 3.5 尾插 3.6 尾删 3.7 查找元素X 3.8 在pos位置修改 3.9 在任意位置之前插入 3.10 在任意位置删除…

【python量化】基于okex API开发的海龟策略

介绍 基于okex api开发的海龟策略,okex海龟策略python实现方式。该程序目前只支持单品种,比如设置ETH后,只对ETH进行做多做空。该程序运行需要两样东西:apikey 和 标的 运行该程序之前,用户需要到okex网站去申请apiK…

嘉绩咨询:八位一体产业创新,赋能品牌新零售

探索新零售领域不断创新高峰的嘉绩咨询在今天全面展现了其“八位一体”产业创新模式,该模式旨在为新零售品牌提供全方位的赋能服务。立足于广州的企业战略导航专家,吹响了帮助中国品牌实现全球化发展的号角。 嘉绩咨询的核心业务涵盖招商教育、招商落地、…

【C++】6-12 运动成绩排名 分数 10

6-12 运动成绩排名 分数 10 全屏浏览 切换布局 作者 范鹏程 单位 内蒙古师范大学 某大学开田径运动会,现有12名选手参加100米比赛,对应的运动员号及成绩如表所示,请按照成绩排名并输出,要求每一行输出名次、运动员号及成绩。 …

Java学习笔记之IDEA的安装与下载以及相关配置

1 IDEA概述 ​IDEA全称IntelliJ IDEA,是用于Java语言开发的集成环境,它是业界公认的目前用于Java程序开发最好的工具。 集成环境: ​把代码编写,编译,执行,调试等多种功能综合到一起的开发工具。 2 IDEA…

穿戴产品功耗开发——外设篇

上一篇已对主控的硬件和软件层面做了相应的总结,本篇将从手表常见的外设来说明:外设不同状态下对穿戴产品功耗的影响。 手表常见的外设有: 人机交互:LCDTouch等。常见有TFT、AMOLED模组;生物医学传感器:P…

使用TTL直接对esp32-cam进行烧录

首先你要有一个usb转TTL下载器和一个esp32-cam 然后我们要将IO0与GND短接 UOR->TXD UOT->RXD 3V3->3V3 GND->GND

人工智能未来趋势

人工智能(AI)的未来趋势是多方面的,涵盖了技术进步、应用扩展、伦理法规等多个层面。以下是一些主要趋势: 算法进步:深度学习、强化学习等算法将持续优化,可能涌现出新的学习范式。例如,基于大…

[蜥蜴书Chapter2] -- 创建测试集

目录 一、规则 二、方法 1、seed 2、identifier 1)选取一个身份号 2)选取一定比例的身份号作为测试集 3)身份号的选取: 3、利用scikit-learn: 1) 随机生成: 2)注:分类 3&a…

【杂谈】-电动汽车的通信协议有哪些?

电动汽车的通信协议有哪些? 文章目录 电动汽车的通信协议有哪些?1、控制器局域网 (CAN)2、ISO 151183、CHAdeMO4、组合充电系统(CCS)5、Modbus6、本地互连网络 (LIN)7、Ethernet8、蓝牙&WIFI9、总结 电动汽车 (Electric vehic…

python判断ip是否是本机

银河麒麟服务器上下载脚本进行部署的时候,需要判断是部署在本机还是部署在远程服务器上,需要走不同的处理逻辑。 在Python中判断一个IP地址是否是本机的,可以采用以下方法: import socketdef is_local_ip(ip_address):# 获取本机…

Java共享问题 、synchronized 线程安全分析、Monitor、wait/notify

文章目录 1.共享带来的问题1.1 临界区 Critical Section1.2 竞态条件 Race Condition 2. synchronized语法及理解2.1 方法上的 synchronized 3.变量的线程安全分析3.1.成员变量和静态变量是否线程安全?3.2.局部变量是否线程安全?3.2.1 局部变量线程安全分…

Pycharm安装,环境初次配置与运行第一个简单程序

一、Pycharm安装 1.在PyCharm官网中,找到社区版下载链接,下载Pycharm社区版,社区版免费 2.下载成功后,双击下载好的安装包,点击下一步后,点击“浏览”更改安装路径到C盘以外其他硬盘,点击“下…

开发小需求:页面滚动一定距离后,顶部导航栏消失

在Vue3和TypeScript中实现网站顶部导航栏固定&#xff0c;并在页面滚动大于200px时&#xff0c;顶部导航栏消失&#xff0c;出现新的固定在顶部的导航栏 创建一个Vue组件来实现顶部导航栏的逻辑&#xff1a; <template><div class"navbar-wrapper"><…

【大厂AI课学习笔记NO.70】GitHub,GitLab,CODING等

GitHub及其相关产品详细介绍 一、GitHub 定义&#xff1a; GitHub是一个面向开源及私有软件项目的托管平台&#xff0c;因为只支持Git作为唯一的版本库格式进行托管&#xff0c;故名GitHub。它提供Git仓库的托管服务&#xff0c;并且提供多种功能帮助软件开发者更高效地协作和…

k8s安全控制、授权管理介绍

目录 一.Kubernetes安全控制介绍 1.客户端认证操作 2.访问对象资源依次流程 二.授权管理介绍 1.AlwaysDeny 2.AlwaysAllow 3.ABAC 4.Webhook 5.Node 6.RBAC 三.Role解释 1.Role和ClusterRole 2.Rolebinding和ClusterBinding 3.Rolebinding和ClusterRole 四.准入…

LeetCode-22题:括号生成(原创)

【题目描述】 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 【题目链接】. - 力扣&#xff08;LeetCode&#xff09; 【解题代码】 package dp;import java.util.ArrayList; import java.util.Arrays; im…