11.07.2015 Views

ПРИНТЕРЫ СЕГОДНЯ - Xakep Online

ПРИНТЕРЫ СЕГОДНЯ - Xakep Online

ПРИНТЕРЫ СЕГОДНЯ - Xakep Online

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Кодинг108ХАКЕР 04 /171/ 2013Мы видим, что для каждого поля сообщения CardHolder сгенерилсяметод clear_xxx(), где вместо xxx имя поля. По названию не трудно догадаться,что он делает. Также присутствуют методы has_ и set_. Значениеэлемента получается через функцию с именем, аналогичным имени этогоэлемента. Особое внимание следует уделить полю card. Из-за того что мыего пометили как repeated, код для него получился немного другой. В частности,у нас есть метод _size(), который возвращает количество банковскихкарт, закрепленных за человеком, а также метод add_, служащийдля добавления элемента к уже существующим. Поля с пометкой optionalили repeated могут предоставить доступ к сырому указателю с помощьюmutable_ "getter". Для более детального изучения того, что нагенерилprotoc от «корпорации добра», крайне рекомендуется заглянуть внутрь получившегосяh-файла.Помимо перечисленных методов, каждый класс Protocol Buffer имеетфункции сериализации в бинарное представление и парсинга этого представления.Методы для парсинга и сериализацииbool SerializeToString(string* output) const;bool ParseFromString(const string& data);bool SerializeToOstream(ostream* output) const;bool ParseFromIstream(istream* input);Тут следует заметить, что serialize-методы используют STL-строку лишьв качестве контейнера для бинарных данных. Не стоит надеяться, что, заглянуввнутрь string-переменной, можно будет обнаружить хоть сколько-нибудьчитаемый текст.Теперь мы наконец добрались до самого интересного — использованияполученных классов на практике. Это очень просто. Чтобы убедиться в этом,достаточно взглянуть на код ниже.Сериализация и десериализация protobufint main(int argc, char* argv[]){GOOGLE_PROTOBUF_VERIFY_VERSION;CardsApp::CardHoldersList card_holders;}// Добавляем кардхолдераAddToCardHolders(card_holders.add_person());// Записываем в файлfstream output(argv[1], ios::out | ios::trunc| ios::binary);if (!address_book.SerializeToOstream(&output)){cerr

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!