如何让protobuf-net在.Net中展平和取消继承的类?

时间:2013-09-18 04:05:36

标签: c# protobuf-net

这是我之前的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类的序列化和反序列化,因此它可以使用扁平化协议缓冲区定义和线路上的格式。

1 个答案:

答案 0 :(得分:1)

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