Сериализация Java с буфером протокола


Я хочу использовать protobuff в Java-приложении для облегчения сериализации, и у меня есть вопрос об этой цитате с веб-сайта Google

Буферы протокола и O-O дизайн Классы буферов протокола в основном тупые держатели данных (как структуры в C++); они не делают хороший первый класс граждане в объектной модели. Если ты хотите добавить более богатое поведение к сгенерированный класс, Лучший способ сделать это делается для того, чтобы обернуть сгенерированный протокол буфер класса в класс, специфичный для конкретного приложения. Упаковка буферы протокола также хорошая идея если у вас нет контроля над дизайн своего .протофайл (если, скажем, вы повторно используете одно из другого проект). В этом случае вы можете использовать класс обертки для создания интерфейс лучше подходит к уникальному среда вашего приложения: сокрытие некоторых данных и методов, разоблачение функции удобства и т. д. Вы должны никогда не добавляйте поведение к сгенерированному классы путем наследования от них. Этот будет ломаются внутренние механизмы и есть не очень хорошая объектно-ориентированная практика в любом случае.

Откуда: http://code.google.com/apis/protocolbuffers/docs/javatutorial.html

Что это означает, когда он говорит, чтобы обернуть созданный класс?

3 5

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. Как и любая модификация буфер протокола должен пройти через объект обертывания, у вас есть полный контроль над тем, какие операции вы хотите поддерживать.

Что это означает, когда он говорит, чтобы обернуть созданный класс?

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