在Unity中使用Google.Protobuf

  Google.Protobuf通过编译器protoc.exe.proto文档进行编译,编译为C#格式的文件,进行序列化与反序列化。

编译指令:

  1. protoc.exe --proto_path=./ xxx.proto --csharp_out=./
注意:protoc.exe 的路径需要添加至系统路径中。

一、Google.Protobuf安装

  1、新建VS控制台项目。

  2、选择项目,右键菜单选择“管理NuGet程序包”。

  3、浏览 -> Google.Protobuf.Tools -> 安装。

    安装后,在项目的同级目录会生成 packages文件夹。

    此项packages/Google.Protobuf.Tools.3.6.1/tools/windows_x64/protoc.exe是Protobuf编译器,用于将.proto文件生成C#文件。

  4、下载C#资源包,编译protobuf-3.6.1\csharp\src\Google.Protobuf生成Google.Protobuf.dll,并将Google.Protobuf.dll拷贝至Unity中。

二、示例

Person.proto文件:

  1. syntax = "proto3";
  2. package shenjun;
  3. message Person
  4. {
  5. string name = 1;
  6. int32 id = 2;
  7. string email = 3;
  8. enum PhoneType
  9. {
  10. HOME = 0;
  11. MOBILE = 1;
  12. WORK = 2;
  13. }
  14. message PhoneNumber
  15. {
  16. string number = 1;
  17. PhoneType type = 2;
  18. }
  19. repeated PhoneNumber phone = 4;
  20. }

通过protoc.exe进行编译,生成Person.cs文件。

C#代码中使用Person类进行序列化及反序列化:

  1. // 序列化
  2. Person p = new Person();
  3. p.Name = "shenjun";
  4. p.Id = 1;
  5. p.Email = "380921128@qq.com";
  6. p.Phone.Add(new Person.Types.PhoneNumber
  7. {
  8. Number = "12345678901",
  9. Type = Person.Types.PhoneType.Mobile
  10. });
  11. p.Phone.Add(new Person.Types.PhoneNumber
  12. {
  13. Number = "123456",
  14. Type = Person.Types.PhoneType.Home
  15. });
  16. // 转换成byte数组
  17. byte[] buff = p.ToByteArray();
  18. // 保存到文件
  19. using (var stream = File.Create("person.dat"))
  20. {
  21. p.WriteTo(stream);
  22. }
  23. // 反序列化
  24. // 从byte数组反序列化
  25. IMessage IMperson = new Person();
  26. Person person = (Person)IMperson.Descriptor.Parser.ParseFrom(buff);
  27. // 从文件中反序列化
  28. using (var stream = File.OpenRead("person.dat"))
  29. {
  30. Person pDes = Person.Parser.ParseFrom(stream);
  31. }

?