Unity使用C# Protobuf源码

news/2024/11/17 4:48:42/

目录

第一步:下载源码

第二步:运行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.batC:\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.dllGoogle.Protobuf -> C:\Users\HQ\Desktop\protobuf-main\csharp\src\Google.Protobuf\bin\Release\net45\Google.Protobuf.dllGoogle.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 updatevoid 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#脚本扔到工程中,就可以使用这些脚本序列化和反序列化类对象了。

 


http://www.ppmy.cn/news/1022611.html

相关文章

Unreal DataTable使用

目的&#xff1a;在多个地方使用同一份结构体配置 C定义结构体 USTRUCT(BlueprintType) struct FXXX : public FTableRowBase {GENERATED_BODY()UPROPERTY(EditAnywhere, BlueprintReadWrite, Category "XXX")float XXX; }注意&#xff1a; 类的元数据加上 Bluep…

js继承,闭包和css继承

JavaScript继承 继承是一种面向对象编程的重要概念&#xff0c;JavaScript中可以通过原型链实现继承。闭包是一种特殊的函数&#xff0c;它可以访问其外部函数作用域中的变量。 下面是一个使用原型链实现继承的示例代码&#xff1a; // 父类 function Animal(name) {this.na…

C++中四种不同的强制转换方式的区别

在C中&#xff0c;有四种不同的强制转换方式&#xff0c;它们分别是静态转换、动态转换、常量转换和重新解释转换。下面是每种转换的区别&#xff1a; 静态转换&#xff08;static_cast&#xff09; 静态转换是最常用的强制转换方式之一&#xff0c;可以在具有良好定义的类型之…

(贪心) 剑指 Offer 14- I. 剪绳子 ——【Leetcode每日一题】

❓剑指 Offer 14- I. 剪绳子 难度&#xff1a;中等 给你一根长度为 n 的绳子&#xff0c;请把绳子剪成整数长度的 m 段&#xff08;m、n都是整数&#xff0c;n > 1 并且 m > 1&#xff09;&#xff0c;每段绳子的长度记为 k[0],k[1]...k[m-1] 。请问 k[0]*k[1]*...*k[m…

新零售智慧生态电商系统搭建,开源多用户商城系统开发(H5、Java)

搭建新零售智慧生态电商系统和开源多用户商城系统需要进行以下具体步骤&#xff1a; 1. 确定需求&#xff1a;首先明确系统的功能需求和技术要求&#xff0c;包括用户注册和登录、商品管理、购物车、订单管理、支付等功能。 2. 选择技术架构&#xff1a;确定使用的开发语言和…

VBA技术资料MF42:VBA_从Excel中上面的单元格复制公式

【分享成果&#xff0c;随喜正能量】唯有梦想才配让你不安&#xff0c;唯有行动才能解除你的不安.绳锯木断&#xff0c;水滴石穿。也许你现在做的事情很小&#xff0c;只要你能日积月累的坚持下去&#xff0c;才会发现意义非凡。所谓的成功&#xff0c;便是别人失败的时候你还在…

python操作数据库

python操作数据库 首先安装数据插件 pip install pymysqlfrom pymysql import Connection # 引入数据库第三方包# 创建链接 conn Connection(host"localhost", # 主机名ipport3306,user"root",# 用户名password"123456" # 密码 )print(con…

Android 13 MTK平台添加自定义按键,以及CTS问题解决

添加自定义按键流程 一般来说上层添加以下几处修改 驱动层的键值上报,让驱动处理好即可 frameworks / base/core/java/android/view/KeyEvent.java public static final int KEYCODE_DEMO_APP_4 = 304;/** add by songhui for fingerprint Key code */+ public static fina…