Использование: protobuf-net
Я пытаюсь использовать:
string proto = Serializer.GetProto<YourType>();
Но что-то я получаю неправильный вывод.
Я хочу передать интерфейс, чтобы клиент мог использовать методы и класс 2.
[ProtoContract]
public class Whatever
{
[ProtoMember(1)]
public string? Text { get; set; }
}
[ProtoContract]
public class Numb
{
[ProtoMember(1)]
public int? Num { get; set; }
}
[Service("Duplex")]
public interface IDuplex
{
public IAsyncEnumerable<Whatever> Duplex(Numb num, CallContext context = default);
}
Итак, я делаю что-то вроде:
using var writer = new StreamWriter("proto.proto");
writer.WriteLine(Serializer.GetProto<IDuplex>());
writer.WriteLine(Serializer.GetProto<Numb>());
writer.WriteLine(Serializer.GetProto<Whatever>());
writer.Close();
Но я получаю:
syntax = "proto3";
package ConsoleApp1;
message IDuplex {
}
syntax = "proto3";
package ConsoleApp1;
message Numb {
int32 Num = 1;
}
syntax = "proto3";
package ConsoleApp1;
message Whatever {
string Text = 1;
}
Вместо чего-то вроде:
syntax = "proto3";
package ConsoleApp1;
Service IDuplex {
rpc Duplex(Numb) returns(Whatever);
}
message Numb {
int32 Num = 1;
}
message Whatever {
string Text = 1;
}
Как я могу связать много классов, чтобы у меня их не было так много:
syntax = "proto3";
package ConsoleApp1;
И создать сервис для записи в тот же файл?





protobuf-net сам по себе не знает о сервисах; для этого вам понадобится protobuf-net.Grpc, а в данном случае: protobuf-net.Grpc.Reflection, который имеет тип SchemaGenerator; Применение:
var gen = new SchemaGenerator();
var schema = gen.GetSchema(typeof(IDuplex));
Console.WriteLine(schema);
Это дает:
syntax = "proto3";
message Numb {
int32 Num = 1;
}
message Whatever {
string Text = 1;
}
service Duplex {
rpc Duplex (Numb) returns (stream Whatever);
}
(основная причина того, что protobuf-net.Grpc.Reflection является здесь отдельным пакетом, заключается в том, что protobuf-net.Grpc требует только protobuf-net v2.x, но для этой функции требуются API v3.x — следовательно, protobuf-net.Grpc.Reflection принудительно использует protobuf-net v3 Transive)