Создание подклассов в protobuf.net

У меня есть система, построенная на protobuf.net, система предоставляет абстрактный класс (foo), который, как я ожидаю, будет реализован конечным пользователем. Абстрактный класс сериализуем с помощью protobuf.net. В настоящее время, когда я пытаюсь сериализовать реализацию foo, я получаю сообщение об ошибке:

Во время сериализации обнаружен неожиданный тип; типы должны быть включены с ProtoIncludeAttribute; найденный бар передан как foo

В этом есть смысл, я не сказал системе о bar, поэтому, когда я передаю bar как foo, она сбивается. Есть ли изящный способ настроить все так, чтобы программисту, использующему мою библиотеку, было просто делать что-то (желательно просто пометить поля как сериализуемые, как при обычном использовании protobuf.net?

Изменить: очевидно, я не могу использовать protoinclude, так как это требует изменения исходного кода базовой библиотеки.


person Martin    schedule 06.02.2011    source источник


Ответы (1)


В v1 базу нужно будет украсить, чтобы знать о детях. В v2 это ограничение снято; вы можете создать модель во время выполнения и определить все, что захотите. Он все еще может читать атрибуты, все это параллельно (вы можете использовать разные подходы для разных типов, если хотите).

Однако вы можете скрыть детали RuntimeTypeModel за своим собственным API, если вызывающий не хочет знать какие-либо кровавые подробности.

v2 доступна для сборки из основной системы и в значительной степени стабильна - хотя есть некоторые элементы TODO - в основном крайние случаи, которые необходимо выполнить для полной совместимости. Большинство людей не увидят эти случаи.

person Marc Gravell    schedule 07.02.2011
comment
Сколько работы нужно для перехода с v1 на v2? У меня довольно плотный график: / - person Martin; 07.02.2011
comment
@Martin до тех пор, пока вы не попадете в (очень немногие) угловые случаи, довольно минимальные - если хотите, не стесняйтесь отправить мне по электронной почте показательный пример того, чем вы хотите работать, и я Посмотрим, я могу заполнить для вас пробелы ... - person Marc Gravell; 07.02.2011
comment
Спасибо, Марк, я попробую сделать это сам, а потом перезвоню тебе, если я застряну :) - person Martin; 08.02.2011
comment
Ага, это выглядит многообещающе. Думаю, я понимаю, как это будет работать, и это выглядит довольно аккуратно, спасибо, Марк - person Martin; 08.02.2011