• 在Unity中使用Google.Protobuf
    • 一、Google.Protobuf安装
    • 二、示例

    在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. }

    ?