Правильный способ отправки обобщенных типов данных c с protobuf3 в C # /. NET - PullRequest
2 голосов
/ 17 января 2020

Я занимаюсь разработкой приложения с использованием архитектуры плагинов и хочу отправлять объекты между клиентом и сервером, не зная типа отправляемого объекта.

Есть ли способ отправки общих c данных type?

Согласно страницам Microsoft, поле Any может быть ответом на эту проблему вместо использования строки и пользовательской реализации сериализации / десериализации для отправки этих объектов. Однако я не нашел представленные примеры c# понятными. Я пытался решить проблему следующим образом:

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

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

Но, похоже, мне нужно реализовать интерфейс IMessage в моем классе, и я не знаю, как это сделать.

Если бы кто-нибудь мог предоставить базовый пример c, чтобы помочь мне понять, как это сделать, это было бы здорово.

Спасибо!

1 Ответ

4 голосов
/ 17 января 2020

Вам необходимо создать протобуф-сообщения, которые представляют отправляемые вами данные. Вам не нужно создавать свои собственные классы, как это было с вашим классом ClassTest.

Вот пример:

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();

Чтобы включить автоматическую генерацию кода c C# для написанных выше файлов .proto, не забудьте: Добавьте этот раздел ItemGroup в ваш файл .csproj:

<ItemGroup>
  <Protobuf Include="point.proto" Link="point.proto" />
  <Protobuf Include="generic_dto_message.proto" Link="generic_dto_message.proto" />
</ItemGroup>

Надеюсь, это поможет!

...