Protobuf сообщение использует неизменяемые списки, и я пытаюсь использовать его в качестве структуры данных - PullRequest
2 голосов
/ 28 октября 2011

Я пишу приложение для Android, которое связывается с веб-сервером для получения данных.Я решил использовать protobuf, и все работает как шарм.

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

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

На данный момент я просто отредактировал автоматически сгенерированный Java-файл, который сгенерировал protoc, чтобы вернуть обычные списки, а не неизменяемые, но это довольно глупо, если позже мне понадобится восстановить этот файл.

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

1 Ответ

1 голос
/ 28 октября 2011

Вы никогда не должны изменять сгенерированные классы буферов протокола.

Сгенерированные классы сообщений являются неизменяемыми. Чтобы изменить объект, вам нужно использовать соответствующий ему класс Builder, чтобы сгенерировать новое сообщение из существующего, манипулировать им через методы его установки, а затем вызвать build(), чтобы вернуть измененный объект. Например:

person.toBuilder()
    .setName("Jeff")
    .addPhone(phoneNumber)
    .build();

См. "Построители против сообщений" в руководстве по protobuf:

http://code.google.com/apis/protocolbuffers/docs/javatutorial.html#builders

...