<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          老程序員為什么從不使用 Java 自帶的序列化?

          共 6105字,需瀏覽 13分鐘

           ·

          2021-06-22 16:39

          上一篇:深夜看了張一鳴的微博,讓我越想越后怕


          作者:rickiyang

          原文:www.cnblogs.com/rickiyang/p/11074232.html

          談到序列化我們自然想到 Java 提供的 Serializable 接口,在 Java 中我們?nèi)绻枰蛄谢恍枰^承該接口就可以通過(guò)輸入輸出流進(jìn)行序列化和反序列化。
          但是在提供很用戶簡(jiǎn)單的調(diào)用的同時(shí)他也存在很多問(wèn)題:
          1、無(wú)法跨語(yǔ)言
          當(dāng)我們進(jìn)行跨應(yīng)用之間的服務(wù)調(diào)用的時(shí)候如果另外一個(gè)應(yīng)用使用c語(yǔ)言來(lái)開(kāi)發(fā),這個(gè)時(shí)候我們發(fā)送過(guò)去的序列化對(duì)象,別人是無(wú)法進(jìn)行反序列化的因?yàn)槠鋬?nèi)部實(shí)現(xiàn)對(duì)于別人來(lái)說(shuō)完全就是黑盒。
          2、序列化之后的碼流太大
          這個(gè)我們可以做一個(gè)實(shí)驗(yàn)還是上一節(jié)中的Message類,我們分別用java的序列化和使用二進(jìn)制編碼來(lái)做一個(gè)對(duì)比,下面我寫(xiě)了一個(gè)測(cè)試類:


          @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序列化后的長(zhǎng)度: "+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("使用二進(jìn)制序列化的長(zhǎng)度:"+result.length);

              } catch (IOException e) {
                  e.printStackTrace();
              }
          }


          輸出結(jié)果為:

          我們可以看到差距是挺大的,目前的主流編解碼框架序列化之后的碼流也都比java序列化要小太多。

          3、序列化效率
          這個(gè)我們也可以做一個(gè)對(duì)比,還是上面寫(xiě)的測(cè)試代碼我們循環(huán)跑100000次對(duì)比一下時(shí)間:
          @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序列化后的長(zhǎng)度: "+b.length);*/
                      os.close();
                      out.close();
                  }
                  long endTime = System.currentTimeMillis();
                  System.out.println("jdk序列化100000次耗時(shí):" +(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("使用二進(jìn)制序列化的長(zhǎng)度:"+result.length);*/
                  }
                  long endTime1 = System.currentTimeMillis();
                  System.out.println("使用二進(jìn)制序列化100000次耗時(shí):" +(endTime1 - startTime1));

              } catch (IOException e) {
                  e.printStackTrace();
              }
          }


          結(jié)果為:

          結(jié)果為毫秒數(shù),這個(gè)差距也是不小的。

          結(jié)合以上我們看到:
          目前的序列化過(guò)程中使用 Java 本身的肯定是不行,使用二進(jìn)制編碼的話又的我們自己去手寫(xiě),所以為了讓我們少搬磚前輩們?cè)缫呀?jīng)寫(xiě)好了工具讓我們調(diào)用,目前社區(qū)比較活躍的有 google 的 Protobuf 和 Apache 的 Thrift。


          感謝您的閱讀,也歡迎您發(fā)表關(guān)于這篇文章的任何建議,關(guān)注我,技術(shù)不迷茫!小編到你上高速。


              · END ·
          最后,關(guān)注公眾號(hào)互聯(lián)網(wǎng)架構(gòu)師,在后臺(tái)回復(fù):2T,可以獲取我整理的 Java 系列面試題和答案,非常齊全。


          正文結(jié)束


          推薦閱讀 ↓↓↓

          1.不認(rèn)命,從10年流水線工人,到谷歌上班的程序媛,一位湖南妹子的勵(lì)志故事

          2.如何才能成為優(yōu)秀的架構(gòu)師?

          3.從零開(kāi)始搭建創(chuàng)業(yè)公司后臺(tái)技術(shù)棧

          4.程序員一般可以從什么平臺(tái)接私活?

          5.37歲程序員被裁,120天沒(méi)找到工作,無(wú)奈去小公司,結(jié)果懵了...

          6.IntelliJ IDEA 2019.3 首個(gè)最新訪問(wèn)版本發(fā)布,新特性搶先看

          7.漫畫(huà):程序員相親圖鑒,笑屎我了~

          8.15張圖看懂瞎忙和高效的區(qū)別!

          一個(gè)人學(xué)習(xí)、工作很迷茫?


          點(diǎn)擊「閱讀原文」加入我們的小圈子!

          瀏覽 34
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  青青操视频网站 | 欧美日韩3p | 精品人妻免费视频 | 天天夜爽爽 | 国产美女极度色诱视频WWW |