【发布时间】:2022-01-12 12:31:03
【问题描述】:
我正在创建一个 gRPC 服务,我们决定使用 protobuf-net 选择代码优先方法。 现在我遇到了一个场景,我们有几个需要包装的类。 我们不想在 MyMessage 类中定义 KnownTypes(只是一个示例名称来说明问题)。 所以我正在尝试使用 Any 类型,这让我在打包时遇到了一些困难。
示例代码包含 MyMessage,它定义了一些标头值,并且必须可以将任何类型作为有效负载传递。
[ProtoContract]
public class MyMessage
{
[ProtoMember(1)] public int HeaderValue1 { get; set; }
[ProtoMember(2)] public string HeaderValue2 { get; set; }
[ProtoMember(3)] public Google.Protobuf.WellknownTypes.Any Payload { get; set; }
}
[ProtoContract]
public class Payload1
{
[ProtoMember(1)] public bool Data1 { get; set; }
[ProtoMember(2)] public string Data2 { get; set; }
}
[ProtoContract]
public class Payload2
{
[ProtoMember(1)] public string Data1 { get; set; }
[ProtoMember(2)] public string Data2 { get; set; }
}
在代码中的某处,我用有效负载构造了我的消息...
Payload2 payload = new Payload2 {
Data1 = "abc",
Data2 = "def"
};
MyMessage msg = new MyMessage
{
HeaderValue1 = 123,
HeaderValue2 = "iAmHeaderValue2",
Payload = Google.Protobuf.WellknownTypes.Any.Pack(payload)
};
这不起作用,因为Payload1 和Payload2 需要实现Google.Protobuf.IMessage。
由于我无法弄清楚如何做,也没有找到很多信息,所以我想知道我是否走错了路。
- 如何在 protobuf-net 中使用 Any?
- 是否有一种简单(但兼容)的方法将 C# 代码第一类打包到 Google.Protobuf.WellknownTypes.Any 中?
- 我真的需要实现 Google.Protobuf.IMessage 吗?
【问题讨论】:
-
如果您只是将您的有效负载转换为
Dictionary<string, string>,这可能是最简单的。[ProtoInclude]似乎用于继承。 IMessage 看起来像手动序列化(读/写字段的字节)。
标签: c# grpc .net-5 protobuf-net protobuf-net.grpc