Условная десериализация - PullRequest
1 голос
/ 18 марта 2010

Я до сих пор не уверен в правильности названия моего вопроса, и, скорее всего, это не так. Однако я потратил некоторое время на поиск как в сети, так и в стеке, и не могу найти хорошее описание проблемы, с которой сталкиваюсь.

По сути, я хочу достичь способности читать некоторые необработанные байты и, основываясь на значении некоторых из них, интерпретировать остальные по-разному. Так работает TLV , вы проверяете тег и, в зависимости от него, интерпретируете результат. Конечно, я всегда могу сохранить эту логику в своем коде C ++, однако я ищу решение, которое бы убрало логику из исходного кода (возможно, к некоторому XML-описанию). Это позволило бы мне более легко описывать различные кодировки (протоколы). Я знаком с Protocol Buffers и некоторыми другими библиотеками сериализации, однако все они решают разные проблемы. Они предполагают, что находятся на обоих концах общения, а я хочу описать общение (вроде).

Есть ли такое решение, если нет, то почему? Существуют ли присущие мне трудности при его реализации?

Ответы [ 2 ]

3 голосов
/ 18 марта 2010

Я считаю, что это легкая задача, много работы, но легко.

Два важных понятия: 1) фабрики и 2) объекты управления десериализация . Фабрики создадут экземпляр объекта на основе идентификатора или тега. Как только объект создан, он отвечает за загрузку своих членов из потока данных (или буфера).

Более простой дизайн может заключаться в реализации вложенных фабрик. Фабрика вызывает суб-фабрику на основе идентификатора. Это может продолжаться по цепочке, пока не будет вызван финальный статический метод создания для создания соответствующего экземпляра объекта.

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

Надеюсь, это поможет.

1 голос
/ 18 марта 2010

Я не знаю ничего подобного.

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

...