Unity3D簡單使用Protobuf-net(二)

上一節使用的是NuGet程序包的方式,在程序中簡單的使用Protobuf-net,接下來換一種方式。 
使用源碼編譯後的動態鏈接庫,這樣有個好處就是,你可以選擇目標平臺。 
首先需要下載源碼:https://github.com/mgravell/protobuf-net

可以使用git克隆項目,也可以下載壓縮包,本人使用的是git方式。 
源碼獲取後,打開源碼目錄下的“Proto 2013.sln”工程文件打開項目,本人使用的是Vs2015。 
只需要關注三個工程即可: 
1. protobuf-net:核心工程,生成後的dll就是上一節中使用NuGet程序包的方式導入的dll,用於序列化與反序列化等操作。 
2. protogen:用於將標準的protobuf定義文件“ * .proto”轉換成“ * .cs”文件,這樣就免去了重新定義協議。 
3. precompile:用於生成protogen生成的文件所生成的dll所對應的序列化與反序列化dll。

這裏寫圖片描述

因爲要在Unity中使用,所以生成配置調整到unity且爲AnyCpu。然後生成如上三個工程,將生成的文件全部拷貝出來根據工程重命名一下,如下:

這裏寫圖片描述

至此,所需的工具就準備完成。 
接下來在將講解在Unity中如何使用它們。

第一步,使用protogen將“.proto”定義文件生成對應的“.cs”文件。

直接使用protogen自帶的“descriptor.proto”文件。 
執行以下命令:

//將decriptor.proto文件轉換成decriptor.cs文件,且命名空間爲MyProto
.\protogen.exe -i:descriptor.proto -o:descriptor.cs -ns:MyProto

第二步,創建動態鏈接庫工程,將decriptor.cs生成對應的decriptor.dll動態鏈接庫。

本人使用的是MonoDevelop,當然也可以使用VS(.Net 3.5以下)。 
創建名爲“descriptor”動態鏈接庫工程,刪除工程創建時自動生成的.cs文件,然後將“descriptor.cs”導入到工程當中,並且引用“protobuf-net”工程生成的“protobuf-net.dll”動態鏈接庫。 
需要注意的是,只能生成Release版,且需要允許不安全代碼。本人設置的目標框架是“Mono/.NET2.0”。 
啓動生成工程就得到了decriptor.dll動態鏈接庫。

第三步,使用precompile生成decriptor.dll對應的序列化與反序列化的“descriptor.serializer.dll”動態鏈接庫。

將生成的decriptor.dll與protobuf-net.dll放在同一個文件夾下。 
執行以下命令:

//生成 descriptor.dll對應的descriptor.serializer.dll,且命名空間爲MyProto.Serializer
.\precompile\precompile.exe -o:descriptor.serializer.dll -t:MyProto.Serializer descriptor.dll

至此Unity工程所需要的文件就準備好了。如果對工具的命令有不懂的地方,可以直接再後面加上“/?”獲得幫助。

  • protobuf-net.dll
  • descriptor.dll
  • descriptor.serializer.dll

接下來就是在Unity工程當中的使用方法。

創建一個Unity工程,將三個dll都導入到工程中,然後創建一個腳本並附加在攝像機上,腳本代碼如下:

using UnityEngine;
using google.protobuf;
using System.IO;
using ProtoBuf.Meta;

public class test : MonoBehaviour
{
    void Start()
    {
        //創建一個序列化反序列化對象
        RuntimeTypeModel ser = MyProto.Serializer.Create();

        //實例化一個需要序列化的對象
        DescriptorProto my = new DescriptorProto();
        my.name = "XiangMu";

        //將序列化後的數據寫入文件
        using (Stream s = File.OpenWrite("test.dat"))
        {
            ser.Serialize(s, my);
        }

        DescriptorProto my2 = null;
        //從文件中讀取並反序列化到對象
        using (Stream s = File.OpenRead("test.dat"))
        {
            my2 = ser.Deserialize(s, my2, typeof(DescriptorProto)) as DescriptorProto;

            //打印
            print(my2.name);
        }
    }
}

使用動態鏈接庫的方法至此就講解完了,下一章將講解如何直接使用源碼的方式在Unity中使用protobuf-net。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章