上一節使用的是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。