当前位置:网络安全 > 【第290期】为什么不推荐使用Java序列化?

【第290期】为什么不推荐使用Java序列化?

  • 发布:2023-10-05 08:49

2022年5月17日下午4:09 • 面试问题 • 读11 今天我去看牙医,他问我为什么这么年轻牙齿就磨损得这么厉害。我说,在没有人喜欢我的这些年里,我咬牙来到了这里。 一、解释一下序列化的概念 将对象转换为字节序列的过程称为对象序列化。 什么时候需要序列化? 将内存中的对象状态保存到文件或数据库时; 当使用套接字通过网络传输对象时; 通过RMI传输对象时; 总之,每当我们将对象持久化到内存中或者通过网络传输它们时,我们都需要对它们进行序列化和反序列化。 如果我们研究一些常用的RPC通信框架,我们会发现它们很少使用Java自带的序列化。是什么原因? 1. 无法跨语言 通过Java原生的Serialized接口和ObjectOutputStream实现的序列化只能由Java语言本身通过ObjectInputStream来解码。其他语言,如C、C++、Python等,无法对其进行解码。在我们实际的开发生产中,有时不可避免的需要不同语言编写的应用程序之间进行通信。这个时候Java自己的序列化就无法处理了。 2. 表现不佳 我们来对比一下Java自带的序列化和NIO中ByteBuffer编码的性能 用户信息类 导入 java.io.ByteArrayOutputStream;导入 java.io.ObjectOutputStream; 公共类主测试{public static void main(String[] args) throws Exception { UserInfo info = new UserInfo(); }信息.setId(1L); info.setName("汤姆"); ByteArrayOutputStream 约 = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream (bout); out.writeObject(信息);出.flush();关闭(); byte[] b = bout.toByteArray(); System.out.println("jdk可序列化:" + b.length) ; ; 输出结果: 正是因为Java自身序列化的这些问题,使得开源社区中涌现出了很多优秀的序列化框架。 我们来看看目前比较主流的序列化框架的特点,可以从以下几个方面进行比较: 是否支持跨平台、跨语言是否满足我们的系统要求? 编码码流大小 效率 使用是否方便(包括社区维护、API复杂程度等) 方便我们根据自己的业务选择适合自己的,来优化系统的序列化性能。 原始缓冲区 结构化数据存储格式(xml、json等) 高性能编解码技术 它与语言和平台无关,具有良好的可扩展性,支持Java、C++和Python三种语言。 谷歌开源 节约 支持多种语言(C++、C#、Cocoa、Erlag、Haskell、java、Ocami、Perl、PHP、Python、Ruby 和 SmallTalk) 用于构建大规模数据交换和存储工具,用于大型系统内部数据传输,相比Json和xml在性能和传输大小上有明显优势。支持通用二进制编码、压缩二进制编码、优化可选字段压缩编解码三种方式。 脸书开源 杰克逊 Jackson依赖的jar包较少,简单易用,性能比较高。 复杂类型的json转换bean会出现问题,部分集合Map、List的转换也会出现问题。 Jackson将复杂类型的bean转换为Json,转换后的json格式不是标准的Json格式。 格森 Gson是目前最通用的Json解析工具 Gson的应用主要是两个转换函数:toJson和fromJson。没有依赖关系,也不需要例外和额外的 jar。 只要类中存在get和set方法,Gson完全可以将复杂类型的json转为bean或者bean转为json。它是JSON解析的神器。 FastJson 无依赖,不需要额外的jar,可以直接在JDK上运行。 FastJson在将复杂类型的bean转换为Json时会出现一些问题。可能会出现引用类型,导致Json转换错误,需要指定引用。 FastJson采用独创算法,将解析速度提升到极致,超越所有json库。 经常被利用的漏洞,被不少公司禁止使用 结尾 推荐十期 【第271期】面试官:Spring MVC的流程是怎样的? 【第272期】数据结构:哈希表原理及面试常见考点【第273期】告诉面试官我可以优化groupBy,而且我很了解! 【第274期】面试官:如何保证缓存和数据库的一致性 【第275期】面试官:你对MySQL中的索引了解多少? 【第276期】面试官:你分析过@Annotation注解的实现原理吗? 【第277期】面试官:说一下常用的几种分布式ID方案 【第278期】面试官:都说select *效率低。你知道原因吗? 【第279期】面试官:Java中遍历Map集合的方式有哪些?他们的效率如何? 【第280期】k8s面试要问什么? 而不是在网上搜索问题?还不赶快关注我们吧~ 版权声明:本文内容由网友自愿贡献,本文所表达的观点仅代表作者自己的观点。本网站仅提供信息存储空间服务,不拥有任何所有权,也不承担相关法律责任。如果您发现本站有任何涉嫌侵权/非法内容,请发送邮件举报。一经核实,该网站将立即删除。本文由斑马博客整理。本文链接为:https://www.sychzs.cn/index.php/post/8302.html

相关文章