我正在创建一个 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 吗?