абстракция сгенерированных сообщений flatbuffers - PullRequest
0 голосов
/ 16 апреля 2020

Я впервые использую планшетные буферы. Я создал свои java классы и проверил сериализацию / десериализацию сообщения. Сейчас я думаю о том, как интегрировать их в мои приложения JavaFx и Android.

Допустимо ли передавать DataMessage или MessageA непосредственно в бизнес-классы c или мой интерфейс? Кажется, действительно неудобно передавать DataMessage, а затем извлекать правильный тип полезной нагрузки. Итак, я создал обертки для каждого типа, поэтому у меня есть MessageAWrapper, который содержит MessageA и Header. Если код клиента / пользовательского интерфейса имеет прямой доступ к значениям из MessageA, или лучше скопировать все поля из MessageA в новые примитивы, определенные в MessageAWrapper. Это, кажется, противоречит тому, для чего предназначены Flatbuffers, но я также чувствую себя грязно, разоблачая MessageA, который имеет специфичные для flatbuffers c методы анализа и тому подобное. Но это также немного работы, чтобы мои классы-обертки копировали поля и сохраняли их, и это может быть подвержено ошибкам. Но где-то в моем стеке я могу, скажем, добавить пару чисел с широтой / долготой в вспомогательный класс под названием GeographicPosition. Я легко могу сделать это в оболочке.

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

Для справки, я создал схему flatbuffers следующим образом:


table MessageA{
    myVal1:float;
    myVal2:float;
    myVal3:int;
}


union MessagePayload { MessageA, MessageB, MessageC }


// top level message class. Contains a header, and a payload consisting of one of the message types specified in the MessagePayload union.
table DataMessage {
    header:Header (required);
    payload:MessagePayload (required);
}

root_type DataMessage;

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

...