c# - 在 C#/.NET 中使用 protobuf3 发送通用数据类型的正确方法

标签 c# grpc .net-core-3.1 protobuf-3

我正在使用插件架构开发一个应用程序,我想在客户端和服务器之间发送对象而不知道被发送的对象的类型。

有没有办法发送通用数据类型?

根据 Microsoft 页面,Any field 可以解决这个问题,而不是使用字符串和自定义序列化/反序列化实现来发送这些对象。但是,我没有找到提供的 c# 例子可以理解。我试图通过这种方式解决问题:

ClassTest myClassTest = new ClassTest();
Any packToSend = Any.Pack(myClassTest);

return Task.FromResult(new UnknownTEST
{
   Pathm = hai
}); ;

但似乎我需要实现IMessage我类的界面,我不知道如何做到这一点。

如果有人能提供一个基本的例子来帮助我理解如何做到这一点,那就太好了。

谢谢 !

最佳答案

您需要创建代表您发送的数据的 protobuf 消息。您不需要像使用“ClassTest”类那样创建自己的类。
下面是一个例子:
点.proto:

syntax = "proto3";
option csharp_namespace = "MyProject.Namespace";

message Point {
    int32 x = 1;
    int32 y = 2;
}
generic_dto_message.proto:
syntax = "proto3";
import "google/protobuf/any.proto";
option csharp_namespace = "MyProject.Namespace";

message GenericDtoMessage {
    google.protobuf.Any data = 1;
}
C#代码:
// packing
var point = new Point
{
    X = 1,
    Y = 22
};
var genericDtoMessage = new GenericDtoMessage();
genericDtoMessage.Data = Any.Pack(point);


// unpacking
var unpackedData = genericDtoMessage.Data.Unpack<Point>();
Console.WriteLine($"X: {unpackedData.X}{Environment.NewLine}Y: {unpackedData.Y}");
Console.WriteLine($"Press any key to continue...");
Console.ReadKey();
如果您使用 Grpc.Tools NuGet 包为上述编写的 .proto 文件生成 C# 代码,请不要忘记添加此 ItemGroup部分到您的 .csproj 文件:
<ItemGroup>
  <Protobuf Include="point.proto" Link="point.proto" />
  <Protobuf Include="generic_dto_message.proto" Link="generic_dto_message.proto" />
</ItemGroup>
希望能帮助到你!

关于c# - 在 C#/.NET 中使用 protobuf3 发送通用数据类型的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59787586/

相关文章:

c#接口(interface)实现错误

java - AWS 网络负载均衡器 (NLB) 是否支持 ALPN?

wpf - SignalR Core 适用于 localhost 但不适用于 Azure 应用服务

c# - System.Text.Json 和动态解析多态对象

mysql - 无法在 .net core 3.1 中从 MySQL 中构建 “datetime” 类型的列

c# - XmlSerializer 不会序列化 IEnumerable

c# - 如何在 C# AspNetCore 网站中使用 JWT JSON Web Tokens?

c# - .net 访问表单例份验证 "timeout"代码中的值

java - 为什么 ManagedChannelBuilder 没有用于与服务器建立 TLS 连接的 TLS 参数?

javascript - 无法使 gRPC 与 Electron.js 一起工作