<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 自帶的序列化?

          共 6434字,需瀏覽 13分鐘

           ·

          2021-06-27 10:29

          你知道的越多,不知道的就越多,業(yè)余的像一棵小草!

          成功路上并不擁擠,因?yàn)閳?jiān)持的人不多。

          編輯:業(yè)余草

          cnblogs.com/rickiyang/p/11074232.html

          推薦:https://www.xttblog.com/?p=5221

          談到序列化我們自然想到 Java 提供的 Serializable 接口,在 Java 中我們?nèi)绻枰蛄谢恍枰^承該接口就可以通過輸入輸出流進(jìn)行序列化和反序列化。

          「但是在提供很用戶簡(jiǎn)單的調(diào)用的同時(shí)他也存在很多問題:」

          無法跨語言

          當(dāng)我們進(jìn)行跨應(yīng)用之間的服務(wù)調(diào)用的時(shí)候如果另外一個(gè)應(yīng)用使用 c 語言來開發(fā),這個(gè)時(shí)候我們發(fā)送過去的序列化對(duì)象,別人是無法進(jìn)行反序列化的因?yàn)槠鋬?nèi)部實(shí)現(xiàn)對(duì)于別人來說完全就是黑盒。

          序列化之后的碼流太大

          這個(gè)我們可以做一個(gè)實(shí)驗(yàn)還是上一節(jié)中的 Message 類,我們分別用 java 的序列化和使用二進(jìn)制編碼來做一個(gè)對(duì)比,下面我寫了一個(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序列化后的長度: "+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)制序列化的長度:"+result.length);

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

          輸出結(jié)果為:

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

          序列化效率

          這個(gè)我們也可以做一個(gè)對(duì)比,還是上面寫的測(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序列化后的長度: "+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)制序列化的長度:"+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é)

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

          瀏覽 31
          點(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>
                  成人黄色片免费 | 国产真实乱婬A片三区高 | 亚洲热情在线播放 | 18禁男女 | 色老板在线观看视频 |