Как заставить 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.