如何让protobuf-net在.Net中压缩和取消inheritance的类?

这是我之前的一个后续问题, 如何让protobuf-net和protostuff相互支持.Net和Java中的inheritance类?

正如那里所解释的那样,我正在Windows系统上现有的基于.Net的程序与我为Android设备创建的新程序之间进行通信。 在.Net端,我正在使用Marc Gravell的伟大的protobuf-net程序,而在Android端,我正在使用David Yu的伟大的protostuff程序。 我正在使用我的(大部分已经存在的)C#类作为“定义类”,并且通过生成的.proto文件,我正在创建相应的Java类。

事情进展得很顺利,除了我遇到的问题是我的许多C#类都是从其他类inheritance的,通常深度为3或4或更多。

在另一个问题中,我曾建议尝试在Java类中复制此inheritance结构。 我现在已经改变了主意,并且更喜欢更简单的东西,而且只需要更改.Net的交易结束。

以下是我的一些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(11)] public string AndroidDeviceName { get { return _androidDeviceName; } set { _androidDeviceName = value; } } } public class ProgramInfoWindows : ProgramInfoBase { private string _windowsMachineName; [ProtoMember(11)] public string WindowsMachineName { get { return _windowsMachineName; } set { _windowsMachineName = value; } } } public class ProgramInfoAndroidClient : ProgramInfoAndroid { private LogOnRequestBase _firstLogOn; [ProtoMember(101)] public LogOnRequestBase FirstLogOn { get { return _firstLogOn; } set { _firstLogOn = value; } } } public class ProgramInfoForOcc : ProgramInfoWindows { private string _licenseCustomerName = "Unlicensed demo version"; private bool _assistanceEditionLicensed = false; [ProtoMember(101)] public string LicenseCustomerName { get { return _licenseCustomerName; } set { _licenseCustomerName = value; } } [ProtoMember(102)] public bool AssistanceEditionLicensed { get { return _assistanceEditionLicensed; } set { _assistanceEditionLicensed = value; } } } 

从这些C#类我想要一些方法来自动生成以下.proto文件,其中类inheritance已被“展平”:

 message ProgramInfoAndroidClient { optional string ProgramName = 1; optional string ProgramVersion = 2; optional string AndroidDeviceName = 11; optional LogOnRequestBase FirstLogOn = 101; } message ProgramInfoForOcc { optional string ProgramName = 1; optional string ProgramVersion = 2; optional string WindowsMachineName = 11; optional string LicenseCustomerName = 101; optional bool AssistanceEditionLicensed = 102 [default = false]; } 

当然,我希望protobuf-net能够自动执行ProgramInfoAndroidClient和ProgramInfoForOcc类的序列化和反序列化,因此它可以使用扁平化协议缓冲区定义和线路上的格式。

我在protobuf.net中做了一些肮脏的更改,反映了你需要的protostuff的那些方面,除了生成.proto文件。 如果您仍未找到问题的解决方案,我可以与您共享修补的protobuf.net。