1. 程式人生 > >【工具/筆記】ProtoBuf簡易教程(proto3)

【工具/筆記】ProtoBuf簡易教程(proto3)

ProtoBuf 3

  • ProtoBuf
    如今Google官方的ProtoBuf已經出了ProtoBuf的C-sharp版本,使用proto3語言標準,使用庫檔案需要.Net4.x,需要在Unity的PlayerSettings中將.Net舊版本切換至4.x

  • Protobuf與BinaryFormatter比較
    可以參閱這篇

  • 目的
    提升序列化反序列化速度,減小二進位制檔案大小提高傳輸效率,協議檔案更具有可讀性。

  • 定義協議格式
    首先是包體說明,防止在不同專案中命名衝突

    syntax = “proto3”;
    package tutorial;

    如果沒有用以下官方例子中的方式將csharp_namespace指定一個名稱空間的話,將會預設使用package來進行匹配。

    option csharp_namespace = “Google.Protobuf.Examples.AddressBook”;

    接著是定義message,可以使用一些基本型別作為欄位型別,甚至還能在其它的message中使用已經定義的message型別作為欄位型別。

    message Person {
    string name = 1;
    int32 id = 2; // Unique ID number for this person.
    string email = 3;
    enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
    }
    message PhoneNumber {
    string number = 1;
    PhoneType type = 2;
    }
    repeated PhoneNumber phones = 4;
    }
    // Our address book file is just one of these.
    message AddressBook {
    repeated Person people = 1;
    }

    如果一個欄位值沒有被初始化,則會使用預設值。

    • strings預設值是空字元.
    • bytes預設是空.
    • bool預設為false.
    • 數字型別預設值為0.
    • 列舉型別預設是第一個定義的列舉值也就是0.
    • 對於message型別的子彈它沒有設定值,實際型別是根據語言環境來的.

    一個使用了repeated來修飾的欄位,可以看做是個動態陣列。

  • 複用
    可以使用import來匯入其它的.proto檔案實現複用

  • 編譯protobuf

    1. 安裝編譯器
      建議使用PM包管理工具,只需要執行Install-Package Google.Protobuf.Tools就能在專案下的packages目錄下得到一個工具包
    2. 執行編譯命令
      在編譯器所在目錄下執行命令
      protoc -I=$SRC_DIR --csharp_out=$DST_DIR $SRC_DIR/addressbook.proto
      其中$SRC_DIR指的是.proto檔案所在目錄$DST_DIR是目標目錄
      編譯時需要一個Google.Protobufd的庫,也可以通過PM工具下載:Install-Package Google.Protobuf

    3. 按例子編譯完你就得到了5個可用的型別

      • 一個包含元資料的靜態Addressbook類(名稱空間定義的)
      • 一個帶有一個只讀People型別欄位的AddressBook型別.
      • 一個包含屬性Name、Id、Email 的Person類
      • 一個內嵌於Person.Types這個靜態類中的PhoneNumber類
      • 一個同樣內嵌於Person.Types的列舉型別PhoneType

      在使用這個編譯得到的.cs檔案之前需要引入名稱空間:Google.Protobuf.Examples.AddressBook,也就是我們之前自己定義的。
      現在可以直接使用類Person和AddressBook。另外使用嵌入Person中的類PhoneNumber時需要通過Person.Types.PhoneNumber才能得到。
      Person下的列舉PhoneType使用Person.Types.PhoneType得到。
      還有一個只能新增PhoneNumber型別的陣列呼叫Person的例項_person.Phones得到。

      在C#中使用proto中定義的型別例項時需要對成員進行初始化賦值,否則都是預設值。
      另外一般都會把得到的.cs檔案打包成庫.dll檔案

  • 序列化與解析
    一個proto對映生成的cs型別例項擁有一個WriteTo方法可以將型別資訊寫入流中.同時可以通過對應的型別的靜態方法Parser來解析一個寫有該型別資訊的流。
    過程如下:
    先把一個例項寫入一個二進位制檔案中。

    Person person = new Person() { Name = “me”, Id = 0, Email = “8888” };
    FileStream fs= File.Create(“./person.dat”);
    person.WriteTo(fs); //注意這一步必須要有引入Google.Protobuf這個庫,可通過前面編譯時說的方式下載。
    fs.Close();

    這時會在你的專案根目錄下得到一個person.dat檔案。

    解析二進位制檔案得到一個Person例項。

    FileStream fs= File.Open(“./person.dat”, FileMode.Open);
    Person person= Person.Parser.ParseFrom(fs);
    fs.Close();
    Debug.Log(string.Format(“Name:{0} ID:{1} Email:{2}”, person.Name, person.Id, person.Email) );

    列印資訊//Name:me ID:0 Email:8888

  • 型別對比proto3

    .proto type
    double
    float
    int32
    int64
    uint32
    uint64
    sint32
    sint64
    fixed32
    fixed64
    sfixed32
    sfixed64
    bool
    string
    bytes
  • 開發流程

    1. 書寫協議定義檔案
    2. 將定義協議生成C#程式碼
    3. 將C#程式碼編譯成dll
    4. 將dll匯入到Unity工程的Plugins目錄
    5. 在遊戲裡呼叫dll

更多官方資料

相關推薦

工具/筆記ProtoBuf簡易教程(proto3)

ProtoBuf 3 ProtoBuf 如今Google官方的ProtoBuf已經出了ProtoBuf的C-sharp版本,使用proto3語言標準,使用庫檔案需要.Net4.x,需要在Unity的PlayerSettings中將.Net舊版本切換至4.x

資料庫筆記編寫JDBC的工具

註冊驅動和資料庫連線是固定操作,何不將這些固定操作封裝成一個類,並且提供靜態方法返回資料庫連線物件,達到程式碼的重複利用: /* * JDBC的工具類 * 用於註冊驅動,連線資料庫 */ import java.sql.Connection; import java.sql.Drive

SIKIA計劃_04_C#中級教程 (2015版)筆記

IKIC#中級教程 (2015版) 正常模式指的是不會影響程式的正常執行。 1,在VS中我們使用Console.Write(或者WriteLine)方法向控制檯輸出變數的值,通過這個我們可以檢視變數的值是否符合我們的預期來除錯錯誤。 2,在Unity中我們使用Debug.Log(""

SIKIA計劃_03_C#初級教程 (2015版)筆記

Win32 API是微軟的作業系統Windows提供給開發人員的程式設計介面,它決定了我們開發的Windows應用程式的能力。MFC是微軟為開發人員提供的類庫,在某種意義上是對Win32 API的封裝。 MFC有一種被稱為MFC擴充套件DLL的共享機制。但是你只能在MFC應用程式中使用它們。

學習筆記版本控制工具 GIT

前言 GIT是一個分散式的版本控制工具。 參考資料 git官方教程-中文版 及 廖雪峰老師的git教程 下文面向windows系統,所有操作使用git自帶的git bash。 編輯文字文件時不要使用記事本,可以用sublime text或notepad++.

技術筆記實現一個非常簡易的flac裁剪並轉換為wav格式

最近專案中遇到了一個需求是要實現對Flac歌曲的裁剪,而且不能是GPL開源協議的軟體,網上查了一下,foolbar和千千靜聽都是會支援,其中foolbar是開放原始碼的,下載程式碼看了發現是使用的libflac(後來我又找了兩個支援flac格式裁剪的mp3splt和pysourcefile,發現

學習筆記開發工具:1、Git的學習使用(簡單介紹)

一、Git的特點 1、較優的儲存能力; 2、比較好的效能; 3、開源的產品; 4、易備份; 5、支援離線操作; 6、定製工作流程。 二、Git的下載安裝配置 1、下載地址:https://git-scm.com/download/ 進入後選擇對應的作業系

DeepLearningPyTorch (1)PyTorch官方教程個人筆記

PyTorch 官方教程 Getting Started 第一部分 Deep Learning with PyTorch: A 60 Minute Blitz 筆記 文章目錄 1. What is PyTorch? 2. Autogr

學習筆記KALI基本工具使用

基本工具: • 經常使⽤用且功能強⼤大 • 安全從業者必不可少的幫⼿手 • Nc / ncat • Wireshark • Tcpdump NETCAT ——NC( 網路工

筆記webpack4.0教程_配置詳解_圖文_新手入門_快速上手

前言 這篇筆記會從node安裝開始,到搭建基礎的webpack環境為止。中間每一步的配置和遇到的術語、名詞,我都會做簡單的解釋。 同時,這篇博文是一篇記錄我學習webpack的過程筆記,因為我也在學習過程,如果有記述錯誤之處,歡迎指正。 【注:全程系統環境

泛型一個簡易的物件間轉換的工具類(DO轉VO)

最近專案中經常要將資料庫中查出來的DO類轉換為VO類,之前的做法是每個都對應一個XXConverter,重複程式碼把人寫的精疲力竭,於是開發瞭如下工具類。 首先,直接看工具類程式碼: public class BaseConverter<D

學習筆記彙編:關於DEBUG工具使用的時候的一個注意事項

在學習彙編的時候發現一個簡單的程式碼出現了一個奇怪的問題詢問過後發現了DEBUG工具的一個小注意事項(或者說是沒用的知識點)ASSUME SS:STACKS,CS:CODES,DS:a,ES:b a SEGMENT ONE dw 01h,02h,03h,04h,05

學習筆記服務治理工具Dubbo的配置整理

dubbo的結構可分為:服務生產者Provider、服務執行容器Container、服務消費者Consumer、註冊中心Register、監控中心Monitor 作用是,暴露介面,提供服務,其他工廠需要依賴這個介面,像呼叫本地API一樣呼叫遠端API。可以提高程式碼的複用。 公共介面(打包為jar):

讀書筆記關於《精通C#(第6版)》與《C#5.0圖解教程》中的一點矛盾的地方

志銘-2020年2月8日 03:32:03 先說明,這是一箇舊問題,很久很久以前大家就討論了, 哈哈哈,而且先宣告這是一個很無聊的問題,

學習筆記關於DOM4J:使用DOM4J解析XML文檔

文本 class 中產 獲取 ber exce int() logs hone 一、概述 DOM4J是一個易用的、開源的庫,用於XML、XPath和XSLT中。采用了Java集合框架並完全支持DOM、SAX、和JAXP。 DOM4J最大的特色是使用大量的接口,主要接口都在o

學習筆記Java中生成對象的5中方法

目標 獲得 cti com pre lan except 我們 highlight 概述:本文介紹以下java五種創建對象的方式: 1.用new語句創建對象,這是最常用的創建對象的方式。 2.使用Class類的newInstance方法 3.運用反射手段,調用java.la

學習筆記SIFT尺度不變特征 (配合UCF-CRCV課程視頻)

rri cnblogs -o mask 畫出 blocks http ucf 產生 SIFT尺度不變特征 D. Lowe. Distinctive image features from scale-invariant key points, IJCV 2004 -Lect

學習筆記String進階:StringBuffer類(線程安全)和StringBuilder類

n) static this util double 字符串 對象 ice 單線程 一、除了使用String類存儲字符串之外,還可以使用StringBuffer類存儲字符串。而且它是比String類更高效的存儲字符串的一種引用數據類型。 優點:   對字符串進行連接操作時,

讀書筆記iOS-截屏功能的實現。

ima under auto core cal ica dsm gef control 一。整個project文件。 二,代碼 ViewController.m #import "ViewController.h" #import <Q

滲透筆記拿下復旦大學的艱難過程

火墻 可見 兩個 hms www 滲透 dsc serv-u ida 轉載自:L04sblog 一、師出有名某日十分無聊,就和X論壇的超級版主wyzhack瞎吹牛,東年西扯的。後來不知道怎麽的扯到復旦去了,他提議說不如我們黑掉復旦吧。正好當時也比較清閑,就答應一起看看了,嘿