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

沙海 2021年6月11日01:18:02Java评论39字数 2995阅读9分59秒阅读模式
摘要

为什么不建议使用 Java 自带的序列化? 戳一戳→ 程序员的成长之路

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

戳一戳→ 程序员的成长之路 文章源自JAVA秀-https://www.javaxiu.com/31102.html

为什么不建议使用 Java 自带的序列化?文章源自JAVA秀-https://www.javaxiu.com/31102.html

程序员的成长之路文章源自JAVA秀-https://www.javaxiu.com/31102.html

互联网/程序员/技术/资料共享 文章源自JAVA秀-https://www.javaxiu.com/31102.html

关注文章源自JAVA秀-https://www.javaxiu.com/31102.html

阅读本文大概需要 2.8 分钟。文章源自JAVA秀-https://www.javaxiu.com/31102.html

作者:rickiyang出处:www.cnblogs.com/rickiyang/p/11074232.html文章源自JAVA秀-https://www.javaxiu.com/31102.html

谈到序列化我们自然想到 Java 提供的 Serializable 接口,在 Java 中我们如果需要序列化只需要继承该接口就可以通过输入输出流进行序列化和反序列化。文章源自JAVA秀-https://www.javaxiu.com/31102.html

但是在提供很用户简单的调用的同时他也存在很多问题:文章源自JAVA秀-https://www.javaxiu.com/31102.html

1、无法跨语言文章源自JAVA秀-https://www.javaxiu.com/31102.html

当我们进行跨应用之间的服务调用的时候如果另外一个应用使用c语言来开发,这个时候我们发送过去的序列化对象,别人是无法进行反序列化的因为其内部实现对于别人来说完全就是黑盒。文章源自JAVA秀-https://www.javaxiu.com/31102.html

2、序列化之后的码流太大文章源自JAVA秀-https://www.javaxiu.com/31102.html

这个我们可以做一个实验还是上一节中的Message类,我们分别用java的序列化和使用二进制编码来做一个对比,下面我写了一个测试类:文章源自JAVA秀-https://www.javaxiu.com/31102.html

@Testpublic 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秀-https://www.javaxiu.com/31102.html

为什么不建议使用 Java 自带的序列化?文章源自JAVA秀-https://www.javaxiu.com/31102.html

我们可以看到差距是挺大的,目前的主流编解码框架序列化之后的码流也都比java序列化要小太多。文章源自JAVA秀-https://www.javaxiu.com/31102.html

3、序列化效率文章源自JAVA秀-https://www.javaxiu.com/31102.html

这个我们也可以做一个对比,还是上面写的测试代码我们循环跑100000次对比一下时间:文章源自JAVA秀-https://www.javaxiu.com/31102.html

@Testpublic 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秀-https://www.javaxiu.com/31102.html

为什么不建议使用 Java 自带的序列化?文章源自JAVA秀-https://www.javaxiu.com/31102.html

结果为毫秒数,这个差距也是不小的。文章源自JAVA秀-https://www.javaxiu.com/31102.html

结合以上我们看到:文章源自JAVA秀-https://www.javaxiu.com/31102.html

目前的序列化过程中使用 Java 本身的肯定是不行,使用二进制编码的话又的我们自己去手写,所以为了让我们少搬砖前辈们早已经写好了工具让我们调用,目前社区比较活跃的有 google 的 Protobuf 和 Apache 的 Thrift。文章源自JAVA秀-https://www.javaxiu.com/31102.html

<END>文章源自JAVA秀-https://www.javaxiu.com/31102.html

推荐阅读:文章源自JAVA秀-https://www.javaxiu.com/31102.html

这本刷题宝典你也许需要!文章源自JAVA秀-https://www.javaxiu.com/31102.html

MySQL 与 Redis 缓存的同步方案文章源自JAVA秀-https://www.javaxiu.com/31102.html

最近面试BAT,整理一份面试资料《Java面试BATJ通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。

文章源自JAVA秀-https://www.javaxiu.com/31102.html

文章源自JAVA秀-https://www.javaxiu.com/31102.html

获取方式:点个「在看」,点击上方小卡片,进入公众号后回复「面试题」领取,更多内容陆续奉上。文章源自JAVA秀-https://www.javaxiu.com/31102.html

朕已阅 为什么不建议使用 Java 自带的序列化?文章源自JAVA秀-https://www.javaxiu.com/31102.html

继续阅读
速蛙云 - 极致体验,强烈推荐!!!购买套餐就免费送各大视频网站会员!快速稳定、独家福利社、流媒体稳定解锁!速度快,全球上网、视频、游戏加速、独立IP均支持!基础套餐性价比很高!这里不多说,我一直正在使用,推荐购买:https://www.javaxiu.com/59919.html
weinxin
资源分享QQ群
本站是JAVA秀团队的技术分享社区, 会经常分享资源和教程; 分享的时代, 请别再沉默!
沙海
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定