簡體   English   中英

在 C#/.NET 中使用 protobuf3 發送通用數據類型的正確方法

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

我正在使用插件架構開發一個應用程序,我想在客戶端和服務器之間發送對象而不知道被發送的對象的類型。

有沒有辦法發送通用數據類型?

根據 Microsoft 頁面, Any字段可以解決這個問題,而不是使用字符串和自定義序列化/反序列化實現來發送這些對象。 但是,我沒有發現提供的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>

希望能幫助到你!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM