Вы получите java.lang.VerifyError
в любое время, когда существует несоответствие между библиотекой, используемой во время компиляции, и во время выполнения.
Вот еще один поток, в котором перечислены похожие проблемы: Java.lang.verifyerror, как мне исправить или даже выяснить причину?
Извините, я не хотел пропустить этот - увы, я не все вижу.
Учитывая особенности вопроса, я предполагаю, что вы хотя бы частично знакомы с .proto ; поправьте меня, если я ошибаюсь.
[ProtoInclude]
работает так же, как [XmlInclude]
для XmlSerializer
или [KnownType]
для DataContractSerializer
DataContractSerializer 1121124] - он позволяет распознавать подклассы типа во время (де) сериализации. Единственная дополнительная вещь - это то, что ему нужен тег (номер) для идентификации каждого подтипа (который должен быть уникальным и не конфликтовать ни с одним из полей родительского типа).
Re protogen: nope; базовая спецификация (от Google) вообще не предусматривает наследования , поэтому у protogen (через .proto) нет механизма, чтобы выразить это. protobuf-net обеспечивает поддержку наследования как расширение , но делает это таким образом, что сообщения остаются совместимыми с другими реализациями. При нажатии, возможно Я мог бы добавить поддержку прототипов с помощью новых свойств расширения в спецификации Google, но я еще не сделал этого.
Итак; посмотреть на пример; выражает отношения наследования между BaseMessage
и BeginRequest
; независимо от того, делаете ли вы:
Serialize<BaseMessage>(...)
Serialize<BeginRequest>(...)
BaseMessage
) и будет двигаться вверх; что не совсем верно - он записывает данные , начиная с BeginRequest
(так что он знает, что у нас есть BeginRequest
уже в возможно во время десериализации). Важно то, что включены поля из любого родительского типа контракта, и сериализатор смотрит на фактический переданный объект, а не только на тот тип, который вы называете .