Сериализация Java с буфером протокола - PullRequest
5 голосов
/ 01 ноября 2010

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

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

от: http://code.google.com/apis/protocolbuffers/docs/javatutorial.html

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

Ответы [ 3 ]

10 голосов
/ 01 ноября 2010

Перспектива 1

Вы пишете файл .proto и отдаете его протоколу, который генерирует код Builder. Они предлагают не добавлять какие-либо методы в сгенерированный код. Если вы вообще хотите, чтобы к сгенерированному коду добавлялось какое-то пользовательское поведение, ЗАПИШИТЕ СВОЙ КЛАСС, ОБРАТИТЕ сгенерированный код.

Например, скажем, сгенерированный класс protoc - это MyMessageBuilder. И вы хотели добавить метод, который может принимать входные данные XML и выдавать сообщение, специфичное для протобуфа. Вы бы написали XmlToMyMessageBuilder, как показано ниже. Здесь XmlToMyMessageBuilder, ваш класс оборачивает сгенерированный код и добавляет пользовательское поведение fromXml ().

public class XmlToMyMessageBuilder
{
    private final MyMessageBuilder protoBuilder;

    public MyMessage fromXml(byte[] input()
    {
        protoBuilder.setXXX();
    }
}

Это общий хороший принцип программирования.

Перспектива 2

Предоставляя посредника, вы также можете ОТКЛЮЧИТЬ свой код от базового механизма сериализации. Это позволяет переключать реализации сериализатора (скажем, вы хотите сериализовать полезную нагрузку, где все данные представлены в строковом формате ... где сериализация JSON со сжатием является лучшей альтернативой) с низким уровнем воздействия. Вы могли бы сделать что-то вроде этого

public interface MySerializer
{
    boolean serialize(MyDomainObject input);
}

public PBBasedSerializer implements MySerializer
{
    private final MyMessageBuilder protoBuilder;
    ...
}

public JsonBasedSerializer implements MySerializer
{
    private final JSONSerializer jsonSerializer;
    ...
}
3 голосов
/ 01 ноября 2010

Это означает, что вы реализуете свой собственный класс, который содержит объект буфера протокола в качестве частного поля.

Классы протокольных буферов генерируются из файлов .proto. Эти сгенерированные классы имеют все методы для непосредственного управления полями, которые они содержат. Но у них нет методов, которые обслуживают операции более высокого уровня, чем просто изменение поля.

Ваш класс-обёртка может предоставить более богатый или более ограниченный интерфейс пользователям вашего API. Поскольку любая модификация буфера протокола должна проходить через объект обтекания, вы имеете полный контроль над тем, какие операции вы хотите поддерживать.

0 голосов
/ 01 ноября 2010

Что это значит, когда говорится об обёртывании созданного класса?

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

...