Unity Protobuf和JSON對比

Protobuf

什麼是Protobuf?
Protobuf(Protocal buffer)是google的一種數據交換的格式,基於二進制,跨語言、跨平臺。html

在Unity中使用Protobuf
兩種方式:
1.導入Unity專用的Protobuf-net資源包,用C#代碼定義對象。
2.配置.net的Protobuf環境,用原生的.proto文件定義對象。json

這裏測試選用的是第一次種方式。
protobuf-net.unitypackage 連接:https://pan.baidu.com/s/1DBD4... 提取碼:trl4 segmentfault

Protobuf解析代碼封裝:網絡

using System.IO;
using ProtoBuf;

/// <summary>
/// Protobuf解析工具類
/// ZhangYu 2019-05-24
/// <para>blog:https://segmentfault.com/a/1190000019875130</para>
/// </summary>
public class PBParser {

    /// <summary> 序列化 </summary>
    public static byte[] To<T>(T entity) {
        byte[] result = null;
        if (entity != null) {
            using (MemoryStream stream = new MemoryStream()) {
                Serializer.Serialize<T>(stream, entity);
                result = stream.ToArray();
            }
        }
        return result;
    }

    /// <summary> 反序列化 </summary>
    public static T From<T>(byte[] message) {
        T result = default(T);
        if (message != null) {
            using (MemoryStream stream = new MemoryStream(message)) {
                result = Serializer.Deserialize<T>(stream);
            }
        }
        return result;
    }
}

參考資料:
《Unity3D protobuf-net使用方式》https://www.cnblogs.com/mrblu...
《unity中使用protobuf-net》https://blog.csdn.net/kenkao/...
《Protobuf的使用流程》https://www.cnblogs.com/guxin...工具

JSON

什麼是JSON?
JSON(JavaScript Object Notation,JS對象表示法)是一種輕量級的數據交換格式,基於文本,跨語言、跨平臺。
JSON擁有簡潔、易讀寫的特色。性能

一個簡單的JSON:學習

{
    "id":1,
    "username":"zhangyu",
    "password":"123456"
}

參考資料:
《JSON教程》https://segmentfault.com/a/11...測試

Protobuf和JSON對比

測試對象:優化

using ProtoBuf;

[ProtoContract]
public class TestVo {

    [ProtoMember(1)]
    public uint id;
    [ProtoMember(2)]
    public string username;
    [ProtoMember(3)]
    public string password;
    [ProtoMember(4)]
    public string nickname;
    [ProtoMember(5)]
    public byte lv;
    [ProtoMember(6)]
    public float hp;
    [ProtoMember(7)]
    public float mp;
    [ProtoMember(8)]
    public int exp;

}

測試代碼:ui

private void TestVo() {
    TestVo vo = new TestVo();
    vo.id = 1000001;
    vo.username = "zhangyu";
    vo.password = "password";
    vo.nickname = "冰封百度";
    vo.lv = 100;
    vo.hp = 99999f;
    vo.mp = 88888f;
    vo.exp = 9999999;
    vo.isOnline = true;

    // Json
    string json = JsonUtility.ToJson(vo);
    byte[] jsBytes = Encoding.UTF8.GetBytes(json);
    print("Json:" + json);
    print("Json bytes:" + BitConverter.ToString(jsBytes));

    // Protobuf
    byte[] pbBytes = PBParser.To(vo);
    print("Protobuf bytes:" + BitConverter.ToString(pbBytes));

    // Compare Length
    print("Json length:" + jsBytes.Length);
    print("Protobuf length:" + pbBytes.Length);
    
    // 輸出結果:
    // Json:{"id":1000001,"username":"zhangyu","password":"password","nickname":"冰封百度","lv":100,"hp":99999.0,"mp":88888.0,"exp":9999999,"isOnline":true}
    // Json bytes:7B-22-69-64-22-3A-31-30-30-30-30-30-31-2C-22-75-73-65-72-6E-61-6D-65-22-3A-22-7A-68-61-6E-67-79-75-22-2C-22-70-61-73-73-77-6F-72-64-22-3A-22-70-61-73-73-77-6F-72-64-22-2C-22-6E-69-63-6B-6E-61-6D-65-22-3A-22-E5-86-B0-E5-B0-81-E7-99-BE-E5-BA-A6-22-2C-22-6C-76-22-3A-31-30-30-2C-22-68-70-22-3A-39-39-39-39-39-2E-30-2C-22-6D-70-22-3A-38-38-38-38-38-2E-30-2C-22-65-78-70-22-3A-39-39-39-39-39-39-39-2C-22-69-73-4F-6E-6C-69-6E-65-22-3A-74-72-75-65-7D
    // Protobuf bytes:08-C1-84-3D-12-07-7A-68-61-6E-67-79-75-1A-08-70-61-73-73-77-6F-72-64-22-0C-E5-86-B0-E5-B0-81-E7-99-BE-E5-BA-A6-28-64-35-80-4F-C3-47-3D-00-9C-AD-47-40-FF-AC-E2-04-48-01
    // Json length:148
    // Protobuf length:56
}

測試結果:
Protobuf比JSON小。
而從其餘參考資料和測試結果來看:Protobuf比JSON速度快,體積小。JSON比Protobuf可讀性強,易用性強。

結果分析:
Protobuf是基於二進制的,JSON是基於文本格式的,原理上決定了Protobuf速度會更快,體積會更小。
可是JSON畢竟發展好久了,用的更普遍,使用項目衆多,類庫衆多,有些庫通過深度優化,速度很是快了。在某些細節點上,性能不輸於Protobuf,甚至更好。
用某幾個高度優化的細節去對比JSON和Protobuf的性能,有些不客觀,總體上來講,Protobuf比JSON性能要高很多,高數倍到十數倍。

Json和Protobuf該如何選擇?
小孩子才作選擇題,成年人固然是全都要。
我的建議:在對大小和性能不敏感時用JSON,敏感時用Protobuf。
好比本地寫配置文件時用JSON,易讀易修改。網絡傳輸對象數據時用Protobuf,減少數據量。

參考資料:
《全方位評測:Protobuf性能到底有沒有比JSON快5倍?》https://blog.csdn.net/xiaoxia...

閒聊:
在信息爆炸的時代,互聯網技術日新月異,總會有各類各樣的新技術、新工具出現,這是大勢所趨,沒法阻擋。
若是有哪天出現了比JSON更方便、比Protobuf更小的數據格式,我絕不意外,只會欣喜。
咱們要擁抱這種變化,對咱們來講是好事,這些新技術、新工具的出現,讓咱們的工做變得更方便、更效率、更強大了。
固然,這些新出現的技術和工具也須要咱們消耗更多的時間去了解、熟悉、精通。取其精華,去其糟粕便可。

從數據格式來說,從剛開始接觸XML打開了新世界的大門,到見到JSON時的驚豔,再到知道Protobuf時的好奇。
發現這些數據格式都是爲了完成某些特殊功能而實現的,適用環境不一樣,各有優略,很難作到徹底替代,選擇更適合的就好。
基本上分爲兩大類:
1.便於人使用
2.便於網絡傳輸
第一種便於人使用的數據格式,趨向於更簡潔的語法,可能是基於文本格式的,給人讀的。
第二種便於網絡傳輸的數據格式,趨向於更小的體積,給計算機讀的。

第一種格式也許有哪一天會發展到成爲全世界通用的語言,比如今的英語更容易理解,和學習阿拉伯數字0-9的難度相差不大,甚至能夠做爲兒童啓蒙語言。
第二種格式會進化到徹底基於二進制bit來表示對象,數據極其緊湊,體積極小,基本無垃圾數據,沒什麼可壓縮的空間。
PS:做者 ZhangYu 2019-07-25 看看人類須要多少年才能實現這兩種格式。

相關文章
相關標籤/搜索