目录
第一步:下载源码
第二步:运行C#构建文件
第三步:处理报错(如果你已安装对应的SDK则不会报错)
第四步:复制库文件到你的工程
第一步:下载源码
protobuf github源码https://github.com/protocolbuffers/protobuf下载后解压源码,得到文件夹protobuf-main
第二步:运行C#构建文件
protobuf的源码在protobuf-main\csharp\src里,但不要自己打开这个sln工程自己去构建dll,我自己试了一下有不少问题。建议用它的构建工具。
打开powershell界面,运行protobuf-main\csharp\build_packages.bat文件
我这里有报错,缺目标dotnetSDK,如果你提前安装过了,直接去第四步。
报错提示:
第三步:处理报错(如果你已安装对应的SDK则不会报错)
如果没报错,去往第四步。
安装对应的版本,一定要protobuf-main文件夹的global.json配置保持一致
我这里下载的是.net6.0.100
安装完dotnet-sdk后,再次执行
再次运行第二步:
PS C:\Users\HQ\Desktop\protobuf-main\csharp> C:\Users\HQ\Desktop\protobuf-main\csharp\build_packages.bat
C:\Users\HQ\Desktop\protobuf-main\csharp>dotnet restore src/Google.Protobuf.sln
欢迎使用 .NET 6.0!
---------------------
SDK 版本: 6.0.100
遥测
---------
.NET 工具会收集用法数据,帮助我们改善你的体验。它由 Microsoft 收集并与社区共享。你可通过使用喜欢的 shell 将 DOTNET_CLI_TELEMETRY_OPTOUT 环境变量设置为 "1" 或 "true" 来选择退出遥测。
阅读有关 .NET CLI 工具遥测的更多信息: https://aka.ms/dotnet-cli-telemetry
----------------
已安装 ASP.NET Core HTTPS 开发证书。
若要信任该证书,请运行 "dotnet dev-certs https --trust" (仅限 Windows 和 macOS)。
了解 HTTPS: https://aka.ms/dotnet-https
----------------
编写你的第一个应用: https://aka.ms/dotnet-hello-world
查找新增功能: https://aka.ms/dotnet-whats-new
浏览文档: https://aka.ms/dotnet-docs
在 GitHub 上报告问题和查找源: https://github.com/dotnet/core
使用 "dotnet --help" 查看可用命令或访问: https://aka.ms/dotnet-cli
--------------------------------------------------------------------------------------
正在确定要还原的项目…
已还原 C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf.JsonDump\Google.Protobuf.JsonDump.csproj (用时 234 ms)。
已还原 C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf.Test.TestProtos\Google.Protobuf.Test.TestProtos.csproj (用时 234 ms)。
已还原 C:\Users\HQ\Desktop\protobuf-main\csharp\src\AddressBook\AddressBook.csproj (用时 234 ms)。
已还原 C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf\Google.Protobuf.csproj (用时 343 ms)。
C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf.Conformance\Google.Protobuf.Conformance.csproj : warning NU1603: Google.Protobuf.Test 依赖于 NUnit3TestAdapter (>= 4.2.2),但找不到 NUnit3TestAdapter 4.2.2。 已解决 NUnit3TestAdapter 4.3.0 的近似最佳匹配。 [C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf.sln]
C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf.Test\Google.Protobuf.Test.csproj : warning NU1603: Google.Protobuf.Test 依赖于 NUnit3TestAdapter (>= 4.2.2),但找不到 NUnit3TestAdapter 4.2.2。 已解决 NUnit3TestAdapter 4.3.0 的近似最佳匹配。 [C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf.sln]
已还原 C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf.Conformance\Google.Protobuf.Conformance.csproj (用时 3.25 sec)。
已还原 C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf.Test\Google.Protobuf.Test.csproj (用时 3.25 sec)。
C:\Users\HQ\Desktop\protobuf-main\csharp>dotnet pack -c Release src/Google.Protobuf.sln -p:ContinuousIntegrationBuild=true || goto :error
用于 .NET 的 Microsoft (R) 生成引擎版本 17.0.0+c9eb9dd64
版权所有(C) Microsoft Corporation。保留所有权利。
正在确定要还原的项目…
C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf.Conformance\Google.Protobuf.Conformance.csproj : warning NU1603: Google.Protobuf.Test 依赖于 NUnit3TestAdapter (>= 4.2.2),但找不到 NUnit3TestAdapter 4.2.2。 已解决 NUnit3TestAdapter 4.3.0 的近似最佳匹配。 [C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf.sln]
C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf.Test\Google.Protobuf.Test.csproj : warning NU1603: Google.Protobuf.Test 依赖于 NUnit3TestAdapter (>= 4.2.2),但找不到 NUnit3TestAdapter 4.2.2。 已解决 NUnit3TestAdapter 4.3.0 的近似最佳匹配。 [C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf.sln]
所有项目均是最新的,无法还原。
C:\Users\HQ\.nuget\packages\microsoft.build.tasks.git\1.0.0\build\Microsoft.Build.Tasks.Git.targets(24,5): warning : 找 不到具有带目录“C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf”的工作目录的存储库。 [C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf\Google.Protobuf.csproj]
C:\Users\HQ\.nuget\packages\microsoft.build.tasks.git\1.0.0\build\Microsoft.Build.Tasks.Git.targets(47,5): warning : 找 不到具有带目录“C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf”的工作目录的存储库。 [C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf\Google.Protobuf.csproj]
C:\Users\HQ\.nuget\packages\microsoft.sourcelink.common\1.0.0\build\Microsoft.SourceLink.Common.targets(52,5): warning : 源代码管理信息不可用 - 生成的源链接为空。 [C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf\Google.Protobuf.csproj]
C:\Users\HQ\.nuget\packages\microsoft.build.tasks.git\1.0.0\build\Microsoft.Build.Tasks.Git.targets(24,5): warning : 找 不到具有带目录“C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf”的工作目录的存储库。 [C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf\Google.Protobuf.csproj]
C:\Users\HQ\.nuget\packages\microsoft.build.tasks.git\1.0.0\build\Microsoft.Build.Tasks.Git.targets(47,5): warning : 找 不到具有带目录“C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf”的工作目录的存储库。 [C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf\Google.Protobuf.csproj]
C:\Users\HQ\.nuget\packages\microsoft.sourcelink.common\1.0.0\build\Microsoft.SourceLink.Common.targets(52,5): warning : 源代码管理信息不可用 - 生成的源链接为空。 [C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf\Google.Protobuf.csproj]
C:\Users\HQ\.nuget\packages\microsoft.build.tasks.git\1.0.0\build\Microsoft.Build.Tasks.Git.targets(24,5): warning : 找 不到具有带目录“C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf”的工作目录的存储库。 [C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf\Google.Protobuf.csproj]
C:\Users\HQ\.nuget\packages\microsoft.build.tasks.git\1.0.0\build\Microsoft.Build.Tasks.Git.targets(47,5): warning : 找 不到具有带目录“C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf”的工作目录的存储库。 [C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf\Google.Protobuf.csproj]
C:\Users\HQ\.nuget\packages\microsoft.sourcelink.common\1.0.0\build\Microsoft.SourceLink.Common.targets(52,5): warning : 源代码管理信息不可用 - 生成的源链接为空。 [C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf\Google.Protobuf.csproj]
Google.Protobuf -> C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf\bin\Release\netstandard1.1\Google.Protobuf.dll
Google.Protobuf -> C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf\bin\Release\net45\Google.Protobuf.dll
Google.Protobuf -> C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf\bin\Release\netstandard2.0\Google.Protobuf.dll
C:\Users\HQ\.nuget\packages\microsoft.build.tasks.git\1.0.0\build\Microsoft.Build.Tasks.Git.targets(24,5): warning : 找 不到具有带目录“C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf”的工作目录的存储库。 [C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf\Google.Protobuf.csproj]
已成功创建包“C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf\bin\Release\Google.Protobuf.3.24.0.nupkg” 。
C:\Users\HQ\Desktop\protobuf-main\csharp>goto :EOF
PS C:\Users\HQ\Desktop\protobuf-main\csharp>
第四步:复制库文件到你的工程
库文件路径:protobuf-main\csharp\src\Google.Protobuf\bin\Release\net45
放到ThirdParty文件夹里,表示第三方库
第五步: 测试使用protoc.exe生成代码
有了Google.Protobuf的库,我们肯定是要用它序列化和反序列化数据,如何使用它呢?这有个前提就是,我们需要使用protoc.exe帮我们生成好的C#代码。
打开这个protobuf-main\csharp\generate_protos.sh
可以看到,代码里输入了一些proto文件,最终,同名的C#文件会根据配置路径生成出来。
但是!!!我想测试一下生成,发现源码里居然没有protoc.exe文件,那生成个锤子,运行肯定报错,"Unable to find protocol buffer compiler."
也就说,下面代码设置protoc编译程序,没有一个是存在的。。。
先去github下载protoc工具
protoc 官网下载地址https://github.com/protocolbuffers/protobuf/releases下载源码工具zip压缩包,加压后在bin文件夹里有可执行程序protoc.exe
把这个protoc.exe文件拷贝到protobuf-main\csharp路径下,如图
下面开始修改生成文件的脚本,让sh代码识别到这个protoc.exe文件并为我们生成测试文件
使用notpad++打开generate_protos.sh文件
在PROTOC_LOCATIONS变量中,添加"csharp/protoc.exe",这个路径是相对于根路径的,所以前面加上了csharp文件夹路径。
为何测试是否能生成,我们把目标文件夹的pb.cs文件全部删除
然后执行generate_protos.sh文件
经测试,生成流程正常。
第六步: 开始使用protobuf
把测试代码protobuf-main\csharp\src\Google.Protobuf.Test.TestProtos整个文件夹拷贝到Unity中
剔除obj文件夹和csproj文件
protobuf-main\csharp\src\Google.Protobuf.Test.TestProtos文件夹放到Unity的Scripts文件夹里
我们从源码文件夹里随便找个proto做测试
然后随机选择208行的一个message
在Unity里新建脚本TestProto.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Google.Protobuf;
using Google.Protobuf.TestProtos.Proto2;
public class TestProto : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
ForeignMessage message1 = new ForeignMessage();
message1.C = 1;
message1.D = 2;
byte[] result = message1.ToByteArray();
string messag1Byte = "";
for (int i = 0; i < result.Length; i++)
{
messag1Byte += result[i] + "|";
}
Debug.LogError(messag1Byte);
ForeignMessage message2 = ForeignMessage.Parser.ParseFrom(result);
Debug.LogError("message2.C: " + message2.C);
Debug.LogError("message2.D: " + message2.D);
}
}
查看打印结果
总结:
本文章下载了两个东西,分别是Google.Protobuf源码,和C#版本的protoc.exe生成工具
先使用Google.Protobuf源码生成了DLL,扔到Unity中
使用protoc.exe工具把 proto定义文件生成同名的C#脚本
再把这些生成的C#脚本扔到工程中,就可以使用这些脚本序列化和反序列化类对象了。