在我的项目中,我使用 protobuf c 作为服务器,使用 protobuf-net 作为客户端。但是 protobuf c 无法解码客户端使用“ProtoInclude”属性的类。
这是使用protobuf-net的客户端代码
[ProtoContract]
public class MsgBase_Demo : MsgBase
{
/// <summary> id </summary>
[ProtoMember(11)]
public float id;
public MsgBase_Demo()
{
protoName = "MsgBase_Demo";
id = 110;
}
}
这是使用 protobuf c 的服务器代码
message MsgBase_Extent
{
extend MsgBase
{
required MsgBase_Extent msgBase = 1000;
}
optional float id = 11;
}
我该如何处理这个问题。 我试过这个 https://www.indelible.org/ink/protobuf-polymorphism/仍然不起作用。也许我不应该采用继承的方式?
混合代码优先(您的 C#)和模式优先(您的第二个代码块)并不是一个好主意。像 Google Protocol Buffers 这样的东西的整个想法是你拥有“单一版本的事实”。如果您要混合语言,您应该有一个 .proto 文件(您的第二个代码块)并使用
protoc.exe
(或其他操作系统上的等效项)来输出您想要使用的所有不同语言的源代码。
另一件事(我想你已经知道了)是 Google 的
protoc
不会生成 C 代码。看起来您已经在使用 protobuf-c (来自您附加到问题的标签)。假设 protobuf-c 很好,您可以使用 Google 的 protoc
生成 C# 源代码,并使用 protobuf-c 的 protoc-c
生成等效的 C 代码,并使用相同的 .proto 文件作为输入。
从同一个 .proto 文件生成源代码可以避免我认为您遇到的问题,即您的 C# 代码和问题中的 .proto 没有描述同一件事。