1. 程式人生 > >幾種序列化協議(protobuf,xstream,jackjson,jdk,hessian)相關資料對比

幾種序列化協議(protobuf,xstream,jackjson,jdk,hessian)相關資料對比

對比了一下json,xml,java序列化相關的資料對比,從幾個緯度進行對比。

測試緯度

  • 序列化時間
  • 反序列化時間
  • bytes大小

測試程式碼

準備protobuf檔案

Message.proto檔案程式碼  收藏程式碼
  1. import "InnerMessage.proto";  
  2. package demo;   
  3. option java_package = "com.agapple.protobuf.data";  
  4. option java_outer_classname = "MessageProtos";  
  5. option optimize_for = SPEED ;  //CODE_SIZE,LITE_RUNTIME  
  6. option java_generic_services = false;  
  7. message Message {  
  8.     required string strObj = 1 [default="hello"];  
  9.     optional int32 int32Obj = 2;  
  10.     optional int64 int64Obj = 3;  
  11.     optional uint32 uint32Obj = 4;  
  12.     optional uint64 uint64Obj = 5;  
  13.     optional sint32 sint32Obj = 6;  
  14.     optional sint64 sint64Obj = 7;  
  15.     optional fixed32 fixed32Obj = 8;  
  16.     optional fixed64 fixed64Obj = 9;  
  17.     optional sfixed32 sfixed32Obj = 10;  
  18.     optional sfixed64 sfixed64Obj = 11;  
  19.     optional bool   boolObj = 12;  
  20.     optional bytes  bytesObj = 13;  
  21.     optional float folatObj = 14
     [deprecated=true];  
  22.     repeated double doubleObj = 15 [packed=true]; //  
  23.     optional InnerMessage innerMessage = 16;  
  24. }  
Innermessage.proto程式碼  收藏程式碼
  1. import "EnumType.proto";  
  2. package demo;   
  3. option java_package = "com.agapple.protobuf.data";  
  4. option java_outer_classname = "InnerMessageProtos";  
  5. message InnerMessage {   
  6.     optional string name = 1 [default = "name"];  
  7.     optional int32 id = 2;  
  8.     optional EnumType type = 3 [default = UNIVERSAL];  
  9. }  
Enumtype.proto程式碼  收藏程式碼
  1. package demo;   
  2. option java_package = "com.agapple.protobuf.data";  
  3. option java_outer_classname = "EnumTypeProtos";  
  4. enum EnumType {  
  5.     UNIVERSAL = 0;   
  6.     WEB = 1;   
  7.     IMAGES = 2;   
  8.     LOCAL = 3;   
  9.     NEWS = 4;   
  10.     PRODUCTS = 5;   
  11.     VIDEO = 6;   
  12. }  

基本上把protobuf支援的型別都囊括了,包括巢狀型別,列舉型別,以及各種int,uint,bool,bytes。  

依賴關係是Message.proto依賴了InnerMessage物件,而InnerMessage物件裡包含了一個自定義列舉型別EnumType。

生成protobuf javabean

C程式碼  收藏程式碼
  1. cd /home/ljh/work/code/src/main/java  
  2. /home/ljh/work/protobuf/bin/protoc --proto_path=com/agapple/protobuf/ --java_out=. com/agapple/protobuf/EnumType.proto  
  3. /home/ljh/work/protobuf/bin/protoc --proto_path=com/agapple/protobuf/ --java_out=. com/agapple/protobuf/InnerMessage.proto  
  4. /home/ljh/work/protobuf/bin/protoc --proto_path=com/agapple/protobuf/ --java_out=. com/agapple/protobuf/Message.proto  

執行指令碼後就會生成對應的3個javabean檔案: MessageProtos , InnerMessageProtos , EnumTypeProtos。

最後構造測試的protobuf bean程式碼

Java程式碼  收藏程式碼
  1. private static MessageProtos.Message getProtobufBean() {  
  2.         com.agapple.protobuf.data.MessageProtos.Message.Builder messageBuilder = MessageProtos.Message.newBuilder();  
  3.         messageBuilder.setStrObj("message");  
  4.         messageBuilder.setFolatObj(1f);  
  5.         messageBuilder.addDoubleObj(1d);  
  6.         messageBuilder.addDoubleObj(2d);  
  7.         messageBuilder.setBoolObj(true);  
  8.         messageBuilder.setBytesObj(ByteString.copyFrom(new byte[] { 123 }));  
  9.         messageBuilder.setInt32Obj(32);  
  10.         messageBuilder.setInt64Obj(64l);  
  11.         messageBuilder.setSint32Obj(232);  
  12.         messageBuilder.setSint64Obj(264);  
  13.         messageBuilder.setFixed32Obj(532);  
  14.         messageBuilder.setFixed64Obj(564);  
  15.         messageBuilder.setSfixed32Obj(2532);  
  16.         messageBuilder.setSfixed64Obj(2564);  
  17.         messageBuilder.setUint32Obj(632);  
  18.         messageBuilder.setUint64Obj(664);  
  19.         com.agapple.protobuf.data.InnerMessageProtos.InnerMessage.Builder innerMessageBuilder = InnerMessageProtos.InnerMessage.newBuilder();  
  20.         innerMessageBuilder.setId(1);  
  21.         innerMessageBuilder.setName("inner");  
  22.         innerMessageBuilder.setType(EnumType.PRODUCTS);  
  23.         messageBuilder.setInnerMessage(innerMessageBuilder);  
  24.         return messageBuilder.build();  
  25.     }  

準備純Pojo Bean 

同樣的,為了和json , xml以及java序列化有個很好的對比,新建了3個純的pojo bean:  MessagePojo , InnerMessagePojo , EnumTypePojo。

屬性和proto的bean保持一致。

構建bean物件

Java程式碼  收藏程式碼
  1. private static MessagePojo getPojoBean() {  
  2.         MessagePojo bean = new MessagePojo();  
  3.         bean.setStrObj("message");  
  4.         bean.setFolatObj(1f);  
  5.         List<Double> doubleObj = new ArrayList<Double>();  
  6.         doubleObj.add(1d);  
  7.         doubleObj.add(2d);  
  8.         bean.setDoubleObj(doubleObj);  
  9.         bean.setBoolObj(true);  
  10.         bean.setBytesObj(new byte[] { 123 });  
  11.         bean.setInt32Obj(32);  
  12.         bean.setInt64Obj(64l);  
  13.         bean.setSint32Obj(232);  
  14.         bean.setSint64Obj(264);  
  15.         bean.setFixed32Obj(532);  
  16.         bean.setFixed64Obj(564);  
  17.         bean.setSfixed32Obj(2532);  
  18.         bean.setSfixed64Obj(2564);  
  19.         bean.setUint32Obj(632);  
  20.         bean.setUint64Obj(664);  
  21.         InnerMessagePojo innerMessagePojo = new InnerMessagePojo();  
  22.         innerMessagePojo.setId(1);  
  23.         innerMessagePojo.setName("inner");  
  24.         innerMessagePojo.setType(EnumTypePojo.PRODUCTS);  
  25.         bean.setInnerMessage(innerMessagePojo);  
  26.         return bean;  
  27.     }  

具體的測試程式碼

定義測試Template介面

Java程式碼  收藏程式碼
  1. interface TestCallback {  
  2.     String getName();  
  3.     byte[] writeObject(Object source);  
  4.     Object readObject(byte[] bytes);  
  5. }  

統一的測試模板

Java程式碼  收藏程式碼
  1. private static void testTemplate(TestCallback callback, Object source, int count) {  
  2.         int warmup = 10;  
  3.         // 先進行預熱,載入一些類,避免影響測試  
  4.         for (int i = 0; i < warmup; i++) {  
  5.             byte[] bytes = callback.writeObject(source);  
  6.             callback.readObject(bytes);  
  7.         }  
  8.         restoreJvm(); // 進行GC回收  
  9.         // 進行測試  
  10.         long start = System.nanoTime();  
  11.         long size = 0l;  
  12.         for (int i = 0; i < count; i++) {  
  13.             byte[] bytes = callback.writeObject(source);  
  14.             size = size + bytes.length;  
  15.             callback.readObject(bytes);  
  16.             // System.out.println(callback.readObject(bytes));  
  17.             bytes = null;  
  18.         }  
  19.         long nscost = (System.nanoTime() - start);  
  20.         System.out.println(callback.getName() + " total cost=" + integerFormat.format(nscost) + "ns , each cost="  
  21.                            + integerFormat.format(nscost / count) + "ns , and byte sizes = " + size / count);  
  22.         restoreJvm();// 進行GC回收  
  23.     }  

  在測試模板方法中,使用了warmup預熱的概念,就是預先執行目標方法一定的次數,用於避免因為jit的優化影響系統測試。 同時包含了每次測試模板呼叫完成後system.gc保證下一輪的功能測試

  相應的restoreJvm方法: 

Java程式碼  收藏程式碼
  1. private static void restoreJvm() {  
  2.         int maxRestoreJvmLoops = 10;  
  3.         long memUsedPrev = memoryUsed();  
  4.         for (int i = 0; i < maxRestoreJvmLoops; i++) {  
  5.             System.runFinalization();  
  6.             System.gc();  
  7.             long memUsedNow = memoryUsed();  
  8.             // break early if have no more finalization and get constant mem used  
  9.             if ((ManagementFactory.getMemoryMXBean().getObjectPendingFinalizationCount() == 0)  
  10.                 && (memUsedNow >= memUsedPrev)) {  
  11.                 break;  
  12.             } else {  
  13.                 memUsedPrev = memUsedNow;  
  14.             }  
  15.         }  
  16.     }  
  17.     private static long memoryUsed() {  
  18.         Runtime rt = Runtime.getRuntime();  
  19. 相關推薦

    序列協議(protobuf,xstream,jackjson,jdk,hessian)相關資料對比

    對比了一下json,xml,java序列化相關的資料對比,從幾個緯度進行對比。 測試緯度 序列化時間反序列化時間bytes大小 測試程式碼 準備protobuf檔案 Message.proto檔案程式碼  

    java jackson avro kryo等序列與反序列化工具的使用

    最近由於工作需要,需要研究常用的集中序列化方式,主要目的是物件序列化後佔用空間會大大減少,便於儲存和傳輸,下面是幾種序列化方式的使用demo 1. Java自帶的Serialize 依賴jar包:無 程式碼示意: import java.io.{ByteArrayInpu

    Protobuf 序列協議詳解

    Protocol Buffers是Google開發一種資料描述語言,能夠將結構化資料序列化,可用於資料儲存、通訊協議等方面。據Google官方文件介紹,現在Google內部已經有48,162個訊息型別定義在12,183個proto檔案中。本文會從快速入門、語言規範、編碼協議、效能評估等幾個方面對Pr

    學習筆記--離散方式

    常見 然而 stl namespace img 完成 uno find 之前 前言 在OI學習過程中,我們常常會發現一些題目(尤其數據結構題)中,一些數據的範圍很大,但是涉及的數值的個數卻很少,同時我們想用一個數組的下標與這些數據建立一一對應關系,這時我們就需要離散化 大致

    二維數組初始的實際引用

    及其 數組 div sys oid .com tex print class 二維數組的三種初始化及其使用 用三組數組使用三種不同的賦值方式 public class six5{ public static void main(String []args){

    主流序列協議優缺點對比和開發必備網站

    較差 lln 優缺點 定位屬性 大小 tps all book 開發環境 主流序列化協議優缺點和網站推薦 JSON 優點 1 簡單易用開發成本低2 跨語言3 輕量級數據交換4 非冗長性(對比xml標簽簡單括號閉環) 缺點 1 體積大,影響高並發2 無版本檢查,自己做兼容3

    Mat 的初始和賦值方法

    cto 轉換 -m mat tro sha 數據 return main 這幾天用到了由cv::Point3f和std::vector<float>到cv::Mat數據類型的轉換。本質上就是換一下容器。今晚做個小總結。 由Point3f 到 Mat 有兩種方法,

    計算機網路常見的協議

    一 .典型協議:  傳輸層:         常見的協議有  TCP/UDP 協議                  應用層:&nb

    JAVA RPC (三) 之thrift序列協議入門雜談

    首先抱歉讓大家久等了,最近工作的原因,再加上自己維護koalas rpc利用的大部分時間,一直沒騰出空來寫這篇文章。 先放出來自研的企業級RPC框架原始碼地址,上面有使用方式和部署環境說明,說環境部署,其實只需要傻瓜式的安裝一個zookeeper就可以了。 地址:https://gitee.com/a12

    PHP四序列方案

    原文地址:https://t.ti-node.com/thread/... 資料的序列化是一個非常有用的功能,然而目測很多人跟我一樣,在剛接觸這玩意的時候壓根就不理解這貨色到底是幹啥用的,反正老師說了,實在理解不了就先背過再說。 “啥犢子玩意啊,又是序列化、又是反序列化。。。”(圖

    物件的初始方式

    1 常用的幾種物件初始化方式 定義如下的類Test: class Test { public: Test() { cout << "Test()" << endl; } Test(int

    vector的初始方式

    vector的幾種初始化及賦值方式: (1)不帶引數的建構函式初始化 //初始化一個size為0的vector vector<int> abc; (2)帶引數的建構函式初始化 //初始化size,但每個元素值為預設值 vector<int> abc(10);

    hessian原理解析三(序列協議)

    1、序列化   序列化:將資料結構或物件轉換成二進位制串的過程   反序列化:將在序列化過程中所生成的二進位制串轉換成資料結構或者物件的過程       目的:儲存物件狀態或用於網路傳輸 2、hessian 序列化協議 1.0 參考官方文件:http://hessian.c

    30、dubbo都支援哪些通訊協議以及序列協議

    1、面試題 dubbo支援哪些通訊協議?支援哪些序列化協議? 2、面試官心裡分析 上一個問題,說說dubbo的基本工作原理,那是你必須知道的,至少知道dubbo分成哪些層,然後平時怎麼發起rpc請求的,註冊、發現、呼叫,這些是基本的。 接著就可以針對底層進行深入的問問了,比如第一步就

    Spring容器中定義Bean初始方法和銷燬方法

    Spring 容器中的 Bean 是有生命週期的,Spring 允許 Bean 在初始化完成後以及銷燬前執行特定的操作。下面是常用的三種指定特定操作的方法: 通過實現InitializingBean/DisposableBean 介面來定製初始化之後/銷燬之前

    Spring容器中的Bean初始方法和銷燬方法的先後順序

    Spring 容器中的 Bean 是有生命週期的,spring 允許 Bean 在初始化完成後以及銷燬前執行特定的操作。下面是常用的三種指定特定操作的方法: 通過實現InitializingBean/DisposableBean 介面來定製初始化之後/銷燬之前的操作方法;

    開源SIP協議對比(文章很早了,僅供參考)

    幾種開源SIP協議棧對比 2006-12-05 15:49   基於SIP的開發的話,基本還是使用開源的協議棧的,當然也有牛的公司和單位是自己開發協議棧的,不過並不一定比開源的好用,不過可能使用在特定場合時,會有一定優勢吧。   在以前開發UA時,我用的

    Jmeter的引數方式

    - 使用者引數 設定方式:新增→前置處理器→使用者引數,設定如下: 說明:search_keywords是引數名稱,使用者_1/使用者_2/使用者_3是引數的3個值。僅對於多執行緒時,每個執行緒會取其中一個值,若執行緒超過3個,則會重複取這3個值中的一個

    STM32F的序列通訊匯流排總結

    一 USART 通用同步非同步收發器(USART)提供了一種靈活的方法與使用工業標準NRZ非同步序列資料格式的外部裝置之間進行全雙工資料交換。 USART支援同步單向通訊和半雙工單線通訊,也支援LIN(區域性網際網路)、智慧卡協議和IrDA(紅外資料組織)SIR ENDE

    網路通訊協議

    SFTP(Secure File Transfer Protocol):安全檔案傳送協議。可以為傳輸檔案提供一種安全的加密方法。SFTP與 FTP有著幾乎一樣的語法和功能。SFTP為SSH的一部份,是一種傳輸檔案到伺服器的安全方式。在SSH軟體包中,已經包含了一個叫作SFTP(Secure File Tra