Сериализация Java с буфером протокола
Я хочу использовать protobuff в Java-приложении для облегчения сериализации, и у меня есть вопрос об этой цитате с веб-сайта Google
Буферы протокола и O-O дизайн Классы буферов протокола в основном тупые держатели данных (как структуры в C++); они не делают хороший первый класс граждане в объектной модели. Если ты хотите добавить более богатое поведение к сгенерированный класс, Лучший способ сделать это делается для того, чтобы обернуть сгенерированный протокол буфер класса в класс, специфичный для конкретного приложения. Упаковка буферы протокола также хорошая идея если у вас нет контроля над дизайн своего .протофайл (если, скажем, вы повторно используете одно из другого проект). В этом случае вы можете использовать класс обертки для создания интерфейс лучше подходит к уникальному среда вашего приложения: сокрытие некоторых данных и методов, разоблачение функции удобства и т. д. Вы должны никогда не добавляйте поведение к сгенерированному классы путем наследования от них. Этот будет ломаются внутренние механизмы и есть не очень хорошая объектно-ориентированная практика в любом случае.
Откуда: http://code.google.com/apis/protocolbuffers/docs/javatutorial.html
Что это означает, когда он говорит, чтобы обернуть созданный класс?
3 ответа:
Перспектива 1
Вы пишете a .протофайл и передать его в протокол, который генерирует код конструктора. Они предлагают не добавлять никаких методов к сгенерированному коду. Если вы вообще хотите, чтобы в сгенерированный код было добавлено какое-то пользовательское поведение, то напишите свой собственный класс, ОБЕРТЫВАЮЩИЙ сгенерированный код.
Например, предположим, что сгенерированный протоком класс является mymessagebuilder. И вы хотели добавить метод, который может принимать XML-ввод и выплевывать определенное сообщение protobuff. Вы бы написали XmlToMyMessageBuilder, как показано ниже. Здесь XmlToMyMessageBuilder, ваш класс оборачивает сгенерированный код и добавляет пользовательское поведение от fromXml().
Это общий хороший принцип программирования.public class XmlToMyMessageBuilder { private final MyMessageBuilder protoBuilder; public MyMessage fromXml(byte[] input() { protoBuilder.setXXX(); } }
Перспектива 2
Предоставляя посредника, вы также можете отделить свой код от базового механизма сериализации. Это позволяет переключать реализации сериализатора (скажем, вы хотите сериализовать полезную нагрузку, в которой находятся все данные строковый формат...где в JSON seriazation с компрессией-это лучшая альтернатива) с низким уровнем воздействия. Вы могли бы сделать что-то вроде этогоpublic interface MySerializer { boolean serialize(MyDomainObject input); } public PBBasedSerializer implements MySerializer { private final MyMessageBuilder protoBuilder; ... } public JsonBasedSerializer implements MySerializer { private final JSONSerializer jsonSerializer; ... }
Это означает, что вы реализуете свой собственный класс, содержащий объект буфера протокола в качестве частного поля.
Классы буферов протокола генерируются из .прото файлы. Эти созданные классы имеют все методы для непосредственного управления полями, которые они содержат. Но у них нет методов, которые обслуживали бы операции более высокого уровня, чем просто изменение поля.
Ваш класс-оболочка может предоставить более богатый или более ограниченный интерфейс для пользователей вашего API. Как и любая модификация буфер протокола должен пройти через объект обертывания, у вас есть полный контроль над тем, какие операции вы хотите поддерживать.