Как заставить protobuf-net сгладить и откатить унаследованные классы в.Net?

Это дополнительный вопрос к моему предыдущему: как получить protobuf-net и protostuff для взаимной поддержки унаследованных классов в.Net и Java?

Как объяснялось там, я осуществляю связь между существующей программой на основе.Net в системе Windows и новой программой, которую я создаю для устройств Android. На стороне.Net я использую замечательную программу Marcu Gravell protobuf-net, а на стороне Android я использую замечательную программу David Yu для создания прототипов. Я использую мои (в основном уже существующие) классы 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, где наследование классов было "сплющено":

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 ответ

Решение

Я сделал несколько грязных изменений в protobuf.net, которые отражают те аспекты прототипов, которые вам нужны, кроме генерации файлов.proto. Если вы все еще не нашли решение вашей проблемы, я могу поделиться с вами патченным protobuf.net.

Другие вопросы по тегам