2016-04-21 3 views
1

я пытаюсь отправить объект Повсеместно именованный канал, но я не понимаю, как сериализовать мой объект:C++ отправить объекты в именованный канал

class Order { 
public: 
    void       addFile(std::string const &file); 
    void       setType(Parser::Information const &type); 
    std::list<std::string>  getFileList() const; 
    Parser::Information   getType() const; 
    void       clear(); 

private: 
    std::vector<std::string>  fileList; 
    Parser::Information   type; 
}; 

я уже успел сделать свою именованный работу трубы с основные типы данных, но я не понимаю, как отправлять и получать полный объект (без использования форсированной сериализации)

Я попытался поместить данные объекта в структуру, но мне не удалось отправить его по названию трубы ... вероятно, из-за вектора

Может ли кто-нибудь поделиться своими знаниями край со мной пожалуйста

+0

В C++ структура очень похожа на класс. –

+0

std :: vector, и std :: list, и std :: string все имеют указатели. Другими словами, чтобы передать содержимое любого из них, вам придется «устранить» указатели и отправить только данные. Много способов сделать это. Срок исследования «постоянное хранение». –

+1

Для этого вам нужна сериализация. Вам нужно либо написать код, либо использовать существующую инфраструктуру, чтобы (de) сериализовать ваши объекты (to и) из потока байтов. – Useless

ответ

2

Вам нужно преобразовать структуру в нечто, что может вписаться в один массив байтов, который может быть записан в трубу в виде блока памяти. Строкой является простейший пример.

Тривиальный (но негибкий) способ форматирования ваших данных в виде строки будет использовать строковые потоки C++ для записи типа, а затем новую строку, а затем записать первую запись в fileList, затем новую строку, затем вторую запись, новая строка и т. д. Когда дальний конец канала получает эти данные, он должен будет прочитать первую строку из строки, проанализировать ее по типу, затем прочитать каждую из следующих строк и добавить их в список файлов. (Если ваш именованный канал находится по сети, вы можете захотеть закодировать данные как utf-8, чтобы избежать проблем с набором символов.)

На практике вам нужен более гибкий формат файла, который тегирует значения. Общим решением является JSON, который может кодировать несколько структур, векторов, логических, int, double и других значений. JSON всегда utf-8 и может обрабатывать вложенные структуры. C++ - не самый простой язык, из которого можно использовать JSON, но это лучше, чем сканирование собственного решения. Одна библиотека, которая может читать и записывать данные JSON, - https://github.com/open-source-parsers/jsoncpp.

В верхнем конце форматов сериализации используется двоичное кодирование, которое выполняется намного быстрее, чем синтаксический анализ. Однако двоичные данные не читаются человеком, поэтому отлаживать их сложнее. Одним из примеров библиотеки, которая выполняет двоичное кодирование/декодирование, является Cap'n Proto по адресу https://capnproto.org/.

Смежные вопросы