知乎面试官:为什么不建议使用 Java 自带的序列化?

沙海 2021年8月28日09:10:21Java评论41字数 2608阅读8分41秒阅读模式
摘要

智能摘要

智能摘要文章源自JAVA秀-https://www.javaxiu.com/42845.html

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

原文约 1331 | 图片 10 | 建议阅读 3 分钟 | 评价反馈文章源自JAVA秀-https://www.javaxiu.com/42845.html

知乎面试官:为什么不建议使用 Java 自带的序列化?

点击关注 ? Java面试那些事儿 文章源自JAVA秀-https://www.javaxiu.com/42845.html

收录于话题#Java面试那些事儿,359个文章源自JAVA秀-https://www.javaxiu.com/42845.html

大家好,我是D哥点击关注下方公众号,Java面试资料 都在这里

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

作者:rickiyang

来源:www.cnblogs.com/rickiyang/p/11074232.html文章源自JAVA秀-https://www.javaxiu.com/42845.html

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

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

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

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

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

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

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

    输出结果为:文章源自JAVA秀-https://www.javaxiu.com/42845.html

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

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

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

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

      @TestpublicvoidtestSerializable(){ 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 = newbyte[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/42845.html

      结果为:文章源自JAVA秀-https://www.javaxiu.com/42845.html

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

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

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

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

      知乎面试官:为什么不建议使用 Java 自带的序列化?技术交流群知乎面试官:为什么不建议使用 Java 自带的序列化?文章源自JAVA秀-https://www.javaxiu.com/42845.html

      最后,D哥也建了一个技术群,主要探讨一些新的技术和开源项目值不值得去研究及IDEA使用的“骚操作”,有兴趣入群的同学,可长按扫描下方二维码,一定要备注:城市+昵称+技术方向,根据格式备注,可更快被通过且邀请进群。▲长按扫描
      文章源自JAVA秀-https://www.javaxiu.com/42845.html

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

      热门推荐:如何用 Java 写一个自己的 Tomcat 容器,涨姿势了!阿里云面试官:如何决定使用 HashMap 还是 TreeMap?“996”违法!
      文章源自JAVA秀-https://www.javaxiu.com/42845.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:

      确定