这是我之前的How to get protobuf-net and protostuff to mutually support inherited classes in .Net and Java?
的后续问题正如那里所解释的那样,我在Windows系统上现有的基于.Net的程序与我为Android设备创建的新程序之间进行通信。在.Net端,我使用了Marc Gravell的伟大的protobuf-net程序,而在Android端,我使用了David Yu的伟大的protostuff程序。我使用我的(大部分已经存在的)C#类作为"定义类",并通过生成的.proto文件创建相应的Java类。
事情进展顺利,但我遇到的问题是我的许多C#类都是从其他类继承的,通常深度为3或4或更多。
在另一个问题中,我建议尝试在Java类中复制这个继承结构。我现在改变了主意,并且更喜欢更简单的东西,而且只需要更改.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文件的方法,其中类继承已经被平铺了#34;:
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类的序列化和反序列化,因此它可以使用扁平化协议缓冲区定义和线路上的格式。
答案 0 :(得分:1)
我在protobuf.net中做了一些脏的更改,反映了你需要的protostuff的那些方面,除了生成.proto文件。如果您仍未找到问题的解决方案,我可以与您共享修补的protobuf.net。