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

The right way to send generic data types with protobuf3 in C#/.NET

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

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

根据 Microsoft 页面,Any 字段可能是此问题的答案,而不是使用字符串和自定义 serialization/deserialization 实现来发送这些对象。但是,我发现所提供的 c# 示例无法理解。我试图通过这种方式解决问题:

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

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

但是我的 class 中似乎需要实现 IMessage 接口,但我不知道该怎么做。

如果有人能提供一个基本示例来帮助我理解如何执行此操作,那就太好了。

谢谢!

您需要创建代表您发送的数据的 protobuf 消息。您不需要像使用“ClassTest”class.

那样创建自己的 classes

这是一个例子:

point.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>

希望对您有所帮助!