为什么不建议使用 Java 自带的序列化?
以下文章来源方志朋的博客,回复”666“获面试宝典
作者:rickiyang
出处:www.cnblogs.com/rickiyang/p/11074232.html
谈到序列化我们自然想到 Java 提供的 Serializable 接口,在 Java 中我们如果需要序列化只需要继承该接口就可以通过输入输出流进行序列化和反序列化。
但是在提供很用户简单的调用的同时他也存在很多问题:
1、无法跨语言
当我们进行跨应用之间的服务调用的时候如果另外一个应用使用c语言来开发,这个时候我们发送过去的序列化对象,别人是无法进行反序列化的因为其内部实现对于别人来说完全就是黑盒。
2、序列化之后的码流太大
这个我们可以做一个实验还是上一节中的Message类,我们分别用java的序列化和使用二进制编码来做一个对比,下面我写了一个测试类:
@Test
public void testSerializable(){String str = "哈哈,我是一条消息";Message msg = new Message((byte)0xAD,35,str);ByteArrayOutputStream out = new ByteArrayOutputStream();try {ObjectOutputStream os = new ObjectOutputStream(out);os.writeObject(msg);os.flush();byte[] b = out.toByteArray();System.out.println("jdk序列化后的长度: "+b.length);os.close();out.close();ByteBuffer buffer = ByteBuffer.allocate(1024);byte[] bt = msg.getMsgBody().getBytes();buffer.put(msg.getType());buffer.putInt(msg.getLength());buffer.put(bt);buffer.flip();byte[] result = new byte[buffer.remaining()];buffer.get(result);System.out.println("使用二进制序列化的长度:"+result.length);} catch (IOException e) {e.printStackTrace();}
}
输出结果为:
我们可以看到差距是挺大的,目前的主流编解码框架序列化之后的码流也都比java序列化要小太多。
3、序列化效率
这个我们也可以做一个对比,还是上面写的测试代码我们循环跑100000次对比一下时间:
@Test
public void testSerializable(){String str = "哈哈,我是一条消息";Message msg = new Message((byte)0xAD,35,str);ByteArrayOutputStream out = new ByteArrayOutputStream();try {long startTime = System.currentTimeMillis();for(int i = 0;i < 100000;i++){ObjectOutputStream os = new ObjectOutputStream(out);os.writeObject(msg);os.flush();byte[] b = out.toByteArray();/*System.out.println("jdk序列化后的长度: "+b.length);*/os.close();out.close();}long endTime = System.currentTimeMillis();System.out.println("jdk序列化100000次耗时:" +(endTime - startTime));long startTime1 = System.currentTimeMillis();for(int i = 0;i < 100000;i++){ByteBuffer buffer = ByteBuffer.allocate(1024);byte[] bt = msg.getMsgBody().getBytes();buffer.put(msg.getType());buffer.putInt(msg.getLength());buffer.put(bt);buffer.flip();byte[] result = new byte[buffer.remaining()];buffer.get(result);/*System.out.println("使用二进制序列化的长度:"+result.length);*/}long endTime1 = System.currentTimeMillis();System.out.println("使用二进制序列化100000次耗时:" +(endTime1 - startTime1));} catch (IOException e) {e.printStackTrace();}
}
结果为:
结果为毫秒数,这个差距也是不小的。
结合以上我们看到:
目前的序列化过程中使用 Java 本身的肯定是不行,使用二进制编码的话又的我们自己去手写,所以为了让我们少搬砖前辈们早已经写好了工具让我们调用,目前社区比较活跃的有 google 的 Protobuf 和 Apache 的 Thrift。
热门内容:Spring发布新成员:Spring GraphQL!高调出场的GraphQL能火起来了吗?
很哇塞的Java系列实战项目!
翻车!在项目中用了Arrays.asList、ArrayList的subList,被公开批评60岁还在写代码的开发者,他的建议或许正是你现在焦虑的根源!尝试改变一下吧!
最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。
明天见(。・ω・。)ノ♡
为什么不建议使用 Java 自带的序列化?相关推荐
- 2.JAVA自带的序列化反序列化机制
- 【java】java自带的java.util.logging.Logger日志功能
偶然翻阅到一篇文章,注意到Java自带的Logger日志功能,特地来细细的看一看,记录一下. 1.Java自带的日志功能,默认的配置 ①Logger的默认配置,位置在JRE安装目录下lib中的logg ...
- java 参数返回_Java基础---Java中带参数返回值方法的使用(四十)
Java 中带参带返回值方法的使用 如果方法既包含参数,又带有返回值,我们称为带参带返回值的方法. 例如:下面的代码,定义了一个 show 方法,带有一个参数 name ,方法执行后返回一个 Stri ...
- java方法带参数返回值_Java方法中的参数太多,第6部分:方法返回
java方法带参数返回值 在当前的系列文章中,我正在致力于减少调用Java方法和构造函数所需的参数数量,到目前为止,我一直专注于直接影响参数本身的方法( 自定义类型 , 参数对象 , 构建器模式 , ...
- sha256---利用java自带的实现加密
利用java自带的实现加密:参考https://jingyan.baidu.com/article/2fb0ba40a2ef2b00f3ec5f74.html /*** 利用java原生的摘要实现SH ...
- 为什么都建议学java而不是python-为什么都建议学Java而不是Python?两者有什么区别吗?...
熟悉编程的朋友都知道,不管是Java还是Python 一直都是两种非常了不起的,强大的编程语言,但是对于刚开始起步学习编程的朋友来说,会困惑且最经常问的问题是,不知道是该学 Java 还是 Pytho ...
- 为什么都建议学java而不是python-就目前来说,学Java好还是学Python好?
我建议你选择首选JAVA JAVA和Python哪个岗位就业多,更好找工作? 首先目前的情况确实是公司的Java的需求量是要大于Python的,从各大招聘网站上面都可以看得出来,Java是目前企业应用 ...
- 视频教程-微信公众号实战(Java版本,带前后台)-微信开发
微信公众号实战(Java版本,带前后台) 2018年5月创办 威海科进网络科技有限公司,这里的视频主要是为了做个记录,方便员工提升自己的水平 陈健 ¥29.00 立即订阅 扫码下载「CSDN程序员学院 ...
- java 打开url连接访问不了,android 应用Java自带的HttpURLConnection 连接网络 读取返回数据...
android 使用Java自带的HttpURLConnection 连接网络 读取返回数据 @Override protected void onCreate(Bundle savedInstanc ...
最新文章
- SSRS 2012 交互式报表 -- 层次性文档结构图
- 资深专家给.NET初学者的学习建议(转)
- USTC English Club Note20211215
- 数字电路是如何搭建的
- 操作系统实验报告8:进程间通信—消息机制
- python进程、线程、协程
- 用java编程实现集合的交、并、差和补运算
- 后端技术:阿里开源的接口限流神器Sentinel介绍
- java streams_使用Stream.peek在Java Streams内部进行窥视
- 呼呗电销机器人_为什么企业销售电销都用电销外呼智能机器人
- java实验1机动车实验目的_《Java程序设计》实验指导书.doc
- cassss服务未启动_Mysql无法启动情况下,如何恢复数据呢?
- python之函数用法__getitem__()
- 本人见过的最有用的日志!不来转藏肯定后悔
- 友基-绘影G10数位屏到底是个什么东西呢要不要拆了看看
- 算法竞赛入门经典(第2版)-刘汝佳-第九章例题解题源码(C++语言)(部分)
- 阿里云商标注册续展有哪几种?阿里云商标注册续展有优惠券吗?
- Studio One5中文电脑音乐制作宿主软件保卫萝卜
- A Survey on Conversational Recommender Systems(2021)阅读笔记
- Spring双生武魂之IOC