我正在 Windows 系统上的基于 .Net 的程序和 Android 设备之间进行通信。在 .Net 端,我使用 Marc Gravell 出色的 protobuf-net 程序,在 Android 端,我使用 David Yu 出色的 protostuff 程序。
我的程序(到目前为止)是使用 .Net 类作为定义类。我使用 protobuf-net Serializer.GetProto() 方法生成一个 .proto 文件,并使用 protostuff 的 protostuff-compiler 程序生成或多或少对应于 .Net 类的 Java 类。
这似乎工作得很好,除了我遇到了继承问题。是的,我知道,继承不应该与协议缓冲区一起使用。但是 protobuf-net 和 protostuff 都以自己的方式实现了对继承类的支持。
所以我的问题是,有没有人建议一种简单的方法来让继承的 C# 类映射到继承的 Java 类,反之亦然?
这是我正在使用的示例。这些是 C# 类:
public /* abstract */ class ProgramInfoBase
{
private string _programName;
private string _programVersion;
[ProtoMember(1)]
public string ProgramName
{
get { return _programName; }
set { _programName = value; }
}
[ProtoMember(2)]
public string ProgramVersion
{
get { return _programVersion; }
set { _programVersion = value; }
}
}
public class ProgramInfoAndroid : ProgramInfoBase
{
private string _androidDeviceName;
[ProtoMember(1)]
public string AndroidDeviceName
{
get { return _androidDeviceName; }
set { _androidDeviceName = value; }
}
}
public class ProgramInfoWindows : ProgramInfoBase
{
private string _windowsMachineName;
[ProtoMember(1)]
public string WindowsMachineName
{
get { return _windowsMachineName; }
set { _windowsMachineName = value; }
}
}
这是我的 .proto 文件之一:
package Merlinia.MessagingDefinitions;
option java_package = "com.Merlinia.MMessaging_Test.protostuff";
message ProgramInfoAndroid {
optional string AndroidDeviceName = 1;
}
message ProgramInfoBase {
optional string ProgramName = 1;
optional string ProgramVersion = 2;
// the following represent sub-types; at most 1 should have a value
optional ProgramInfoAndroid ProgramInfoAndroid = 1001;
optional ProgramInfoWindows ProgramInfoWindows = 1002;
}
message ProgramInfoWindows {
optional string WindowsMachineName = 1;
}
通过 protostuff 的 protostuff-compiler 程序运行它会生成三个独立的 Java 类,这是意料之中的。但我想要的是让它为Java类生成相应的C#类继承,以及protobuf-net和protostuff之间的序列化和反序列化,以支持两端的继承类。
编辑:
我现在改变主意了。请参阅以下问题:如何让 protobuf-net 在 .Net 中展平和取消展平继承的类?