Protobuf-net Inheritance & Field Numbers - PullRequest
       33

Protobuf-net Inheritance & Field Numbers

1 голос
/ 14 февраля 2012

Я пытаюсь создать систему сериализации для нашего приложения, которая должна уметь обрабатывать наследование.Чтобы еще больше усложнить задачу, приложение расширяемо, поэтому очень маловероятно, что типы будут известны во время компиляции.

Я прочитал предыдущий вопрос stackoverflow , на который был дан ответ и который помог мне получитьДолгий путь к моей цели, но я наткнулся на камень преткновения, который, скорее всего, является скорее недостатком понимания, чем какой-либо реальной проблемой!

Так вот код, который у меня есть в настоящее время ...

public interface IBaseFrame
{

}

public class BasicDataFrame : IBaseFrame
{

}

public class AnotherFrame : BasicDataFrame
{

}

.,,.

RuntimeTypeModel model = TypeModel.Create();
MetaType baseType = model.Add(typeof(IBaseFrame), true);
MetaType basicFrameType = model.Add(typeof(BasicDataFrame),true);

baseType.AddSubType(7, typeof(BasicDataFrame));
model.Add(typeof(AnotherFrame), true);

basicFrameType.AddSubType(8, typeof(AnotherFrame));

Теперь этот код работает правильно (насколько я могу судить!) И все хорошо в мире ... Меня беспокоит то, где значения 7 и 8 используются в приведенном выше коде дляаргумент fieldNumber метода AddSubType.

По мере перечисления плагинов я регистрирую их типы фреймов с помощью SerialisationManager и добавляю их в модель с увеличивающимся счетчиком для fieldNumber (я начинаю его с произвольно большого числа, поэтому мне не нужно беспокоиться о расширении базовых классов в будущем).

Я обеспокоен тем, что, если плагины перечислены в другом порядке или добавлены (или удалены) новые, то автоматически сгенерированный fieldNumber будет отличаться для разных подтипов, которыеЭто приведет к проблемам с общим доступом к файлам журналов между пользователями (которые могут иметь разные плагины и, следовательно, подтипы) или даже файлами в той же системе, когда плагин мог быть удален.

Есть ли какой-нибудь хитрый способ справиться с этимтип наследования автоматически и без возникновения проблем совместимости в будущем или при смене плагинов, или мне нужно придумать механизм, в котором эти fieldNumbers могут гарантированно оставаться неизменными во всех установках?

Буду очень признателен за любую помощь или совет!

1 Ответ

2 голосов
/ 14 февраля 2012

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

...