首页 > 编程语言 >为什么不建议使用Java序列化?

为什么不建议使用Java序列化?

时间:2023-03-27 09:12:37浏览次数:53  
标签:为什么 Java bean json Json 转换 序列化

把对象转换为字节序列的过程称为对象的序列化。

什么情况下需要用到序列化:

  • 把的内存中的对象状态保存到一个文件中或者数据库中时候;
  • 使用套接字在网络上传送对象的时候;
  • 通过RMI传输对象的时候;

总之一句话,只要我们对内存中的对象进行持久化或网络传输, 都需要进行序列化和反序列化。

如果研究过一些常用的RPC通信框架,我们会发现它们极少使用Java自带的序列化,什么原因?

无法跨语言

通过Java的原生Serializable接口与ObjectOutputStream实现的序列化,只有java语言自己能通过ObjectInputStream来解码,其他语言,如C、C++、Python等等,都无法对其实现解码。而在我们实际开发生产中,有时不可避免的需要基于不同语言编写的应用程序之间进行通信,这个时候Java自带的序列化就无法搞定了。

性能差

序列后的码流太大

java序列化的大小是二进制编码的5倍多!

序列化后的二进制数组越大,占用的存储空间就越多,如果我们是进行网络传输,相对占用的带宽就更多,也会影响系统的性能。

我们看一下比较主流的序列化框架的特点,可以从以下方面对比:

  • 是否支持跨平台,跨语言是否符合我们系统要求
  • 编码后的码流大小
  • 效率
  • 使用上是否便捷(包括社区维护、API复杂度等)

Protobuf

  • 结构化数据存储格式(xml,json等)
  • 高性能编解码技术
  • 语言和平台无关,扩展性好,支持java、C++、Python三种语言。
  • Google开源

Thrift

  • 支持多种语言(C++、C#、Cocoa、Erlag、Haskell、java、Ocami、Perl、PHP、Python、Ruby和SmallTalk)
  • 使用了组建大型数据交换及存储工具,对于大型系统中的内部数据传输,相对于Json和xml在性能上和传输大小上都有明显的优势。
  • 支持通用二进制编码,压缩二进制编码,优化的可选字段压缩编解码等三种方式。
  • FaceBook开源

Jackson

  • Jackson所依赖的jar包较少,简单易用并且性能也要相对高些。
  • 对于复杂类型的json转换bean会出现问题,一些集合Map,List的转换出现问题。
  • Jackson对于复杂类型的bean转换Json,转换的json格式不是标准的Json格式

Gson

  • Gson是目前功能最全的Json解析神器
  • Gson的应用主要为toJson与fromJson两个转换函数,无依赖,不需要例外额外的jar
  • 类里面只要有get和set方法,Gson完全可以将复杂类型的json到bean或bean到json的转换,是JSON解析的神器

FastJson

  • 无依赖,不需要例外额外的jar,能够直接跑在JDK上。
  • FastJson在复杂类型的Bean转换Json上会出现一些问题,可能会出现引用的类型,导致Json转换出错,需要制定引用。
  • FastJson采用独创的算法,将parse的速度提升到极致,超过所有json库。
  • 频繁爆漏洞,被相当部分公司禁止使用

 

参考:

 

标签:为什么,Java,bean,json,Json,转换,序列化
From: https://www.cnblogs.com/xfeiyun/p/17260317.html

相关文章

  • ctf反序列化练题
    [SWPUCTF2021新生赛]pop <?phperror_reporting(0);show_source("index.php");classw44m{private$admin='aaa';protected$passwd='123456';......
  • Kotlin 与 JAVA 不同之处
    添加kotlin混编支持要在Android项目中添加Kotlin混编支持,需要进行以下步骤:在项目的build.gradle文件中添加以下代码:kotlinandroid{...//添加kotlin支......
  • Java学习日记
    2023.3.26学习Java打卡类型转换不同类型数据先转化为同一类型,再运算:#低--------------------→高byte,short,char-→int-→long-→float-→double例如://强制转换......
  • 用java实现书城项目(简单增删改查2)
    书城项目登录dao接口:UserDaoUserslogin(Stringusername,Stringpassword);实现:UserDaoImplQueryRunnerqueryrunner=newQueryRunner();Connectionconnection......
  • Java定时任务
    定时任务Timer​JDK​自带的Timer​和TimerTask​可用于创建定时任务,其中TimerTask继承了Runnable接口,重写runnable接口就行.观察源码可知,构造函数中启动了一个......
  • Java入门_一维数组_第四题_数组添加
    题目数组添加要求实现动态的给数组添加元素效果,实现对数组扩容。原始数组使用静态分配,int[]arr={1,2,3}。增加的元素,直接放在数组最后。用户可以通过如......
  • java pta三次题目集的总结
    第一次题目集第一次题目集相对比较简单,整体考验的是我们循环和ifelse逻辑判断还有一定的算法基础,比如最后一题:7-12列出最简真分数序列*题目描述:按递增顺序依次列......
  • JavaSE——File文件
    File类 概述java.io.File类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。 构造方法publicFile(Stringpathname):通过将给定的路......
  • java实现“数据平滑升级”
    文章目录一、摘要二、前提场景说明:三、项目用到的脚本和代码1.项目目录长这样2.java代码、配置文件、部分脚本3.升级包中的部分文件一、摘要所谓的数据平滑升级:指的是比如旧......
  • 《Java》3、修饰符
    3Java修饰符3.1修饰符Java语言提供了很多修饰符,主要分为以下两类:访问修饰符非访问修饰符修饰符用来定义类、方法或者变量,通常放在语句的最前端。  3.2访......