這篇博客主要對Xml,Json,Hessian,Protocol Buffers的序列化和反序列化性能進行對比,Xml和Json的基本概念就不說了。
Hessian:Hessian是一個輕量級的remoting onhttp工具,提供了RMI的功能,采用的是二進制RPC協議,內置了序列化功能。
Protocol Buffers:google的一種數據交換的格式,它獨立於語言,由於它是一種二進制的格式,比使用 xml 進行數據交換快許多,可以把它用於分布式應用之間的數據通信或者異構環境下的數據交換。作為一種效率和兼容性都很優秀的二進制數據傳輸格式,可以用於諸如網絡傳輸、配置文件、數據存儲等諸多領域。Google提供了Java、C++、Python的實現,現在網上也已經有了c#等語言的實現。
XML:使用.Net自帶的XmlSerializer。
Json:使用的是ServiceStack.Text,性能高於Newtonsoft.Json,但是速度最快的應該是fastJSON.net。
Hessian:使用的是HessianCSharp庫, 從nuget上下載。
Protocol Buffers:使用的是protobuf-net,從nuget上下載。
下列是測試使用的實體。

[ProtoContract] public class Student { [ProtoMember(1, IsRequired = true)] public int Id { get; set; } [ProtoMember(2, IsRequired = true)] public string Name { get; set; } [ProtoMember(3, IsRequired = true)] public DateTime Time { get; set; } [ProtoMember(4, IsRequired = true)] public List<string> Books { get; set; } } Student student = new Student() { Id = 1, Name = "Alan", Time = DateTime.Now, Books = new List<string>() { "語文", "數學" } };
測試機器使用的i7HQ 2.6HZ處理器。
下面是測試的結果
序列化


反序列化


序列化后字節長度


先說序列化,這里分別用100次,1000次,10000次和100000次進行了測試,縱坐標是完成時間,單位是毫秒,可以看到在進行10000次以內的測試時,4種序列化的耗時都是很小的,都在200毫秒內,10000次以后,到100000次,都開始增長,最差的是Xml,最好的是Protocol Buffers,但是在10000次內的時候,Hessian要優於Protocol Buffers。
對於反序列化10000次內的差別都不大,但是在10000次的時候我們已經可以看出Hessian比較耗時,到了100000次,Hessian直接超過了 Xml,讓我一直以為是我的代碼出現了問題,表現最好的依然是Protocol Buffers。
序列化后的字節長度,Xml最長這個可以理解,因為文件中包含很多的結尾標簽(</Name>),Protocol Buffers依然是最好。
根據上面的圖,我們幾乎可以很快得出結論:Protocol Buffers是最好的,但是我覺得我們還要從以下幾個方面綜合評估:
1. 可讀性:Xml和Json序列化后都是文本,可讀性都非常好,比如兩個系統要交換數據,如果中間出了差錯,我們可以很方便的查看交換的數據,甚至模擬數據去測試;Hessian和Protocol Buffers都是二進制的,序列化后內容都是不可讀的,這會對系統的排錯造成一定的影響。
2. 通用性:Xml和Json已經是老牌的數據交換格式了,一般系統之間數據交換也就這兩種格式;Hessian和Protocol Buffers都比較冷門,用的比較少。
3. 便捷性:Hessian其實是一個完整的RPC框架,在服務端定義接口並實現接口,將接口復制到客戶端經過少量的編碼,我們就可以在像調用本地方法那樣去調用服務端,這種實現方式是其他三個工具不具有的,並且性能也不差。
1. 以上的測試結果會因為機器配置的差別而結果略有差別。
2. 使用了單線程的測試, 在多線程下還沒有測試。