2015-05-29 4 views
4

Я создаю некоторые данные на C++, которые я хочу получить в программе Python. Я выяснил, как сериализовать/deserialize в/из двоичного файла с boost в C++, но не как получить доступ к данным в Python (без ручного анализа двоичного файла).boost :: serialization in C++, десериализация в Python

Вот мой C++ код для сериализации:

/* Save some data to binary file */ 
template <typename T> 
int serializeToBinaryFile(const char* filename, const T& someValue, 
          const vector<T>& someVector) 
{ 
    ofstream file(filename, ios::out | ios::binary | ios::trunc); 

    if (file.is_open()) 
    { 
     boost::archive::text_oarchive oa(file); 

     int sizeOfDataType = sizeof(T); 

     oa & sizeOfDataType; 
     oa & someValue; 
     oa & someVector; 

     file.close(); 

     return 0; 
    } else { 
     return 1; 
    } 
} 

Вот мой C++ код для десериализации:

/* Load some data from binary file */ 
template <typename T> 
int deSerializeFromBinaryFile(const char* filename, int& sizeOfDataType, 
           T& someValue, vector<T>& someVector) 
{ 
    ifstream file(filename, ios::in | ios::binary); 

    if (file.is_open()) 
    { 
     boost::archive::text_iarchive ia(file); 

     ia & sizeOfDataType; 
     ia & someValue; 
     ia & someVector; 

     file.close(); 

     return 0; 
    } else { 
     return 1; 
    } 
} 

Как я могу загрузить значение и вектор на объекты в программе Python?

+1

Вы можете обернуть свой код десериализации с помощью boost :: python и вызвать его. – m0nhawk

+0

IMHO, лучший способ использовать [Google protobuf] (https://developers.google.com/protocol-buffers/docs/overview) – megabyte1024

ответ

1

Это не так, как оно работает. В принципе есть две причины сериализации/десериализации:

  1. хранить и извлекать в пределах того же пакета SW. Для этого был создан архив фортификации. нет проблем с типами и форматом архива.

  2. сериализуется для связи с другими объектами. Это совершенно другая история, поскольку вам приходится иметь дело с размером машинного слова, ОС, языком программирования, локализацией и т. Д. Здесь вы обычно начинаете с описания сериализованного формата, начиная с примитивных типов, таких как Int32, String, Float, а также композитных типов, таких как Sequence, и так далее. Затем вы думаете, как представлять эти типы на разных языках программирования и как сериализовать/десериализовать. Вы решили использовать, например, struct/namedtuple за Sequence и vector<>/list для List. Хотя boost не был специально разработан для этого, есть шанс использовать xml-архивы, если вы это имеете в виду при описании сериализованного формата.

Существует специальный случай, если вы хотите общаться на одной машине. Здесь вы можете обернуть сериализацию (я настоятельно рекомендую использовать ту же DLL на стороне C++ и python). Так или иначе, вы должны придерживаться типов pythons.

1

Используйте boost python, чтобы вывести функцию десериализации на python. Вам нужно будет открыть функцию для каждого типа, который вам нужен отдельно (не может выставлять шаблоны на python).

+1

Использование портативного формата (например, XML), как это предлагает Ричард Ходжес, обычно лучший вариант. –

4

Документация по ускорению ссылается на то, что двоичное представление не переносимо или даже гарантировано согласовано в разных версиях вашей программы.

Возможно, вы захотите использовать сериализатор xml, который доступен в boost :: serialization, а затем использовать синтаксический анализатор xml в python для чтения.

инструкции (и пример) о том, как сделать это здесь: http://www.boost.org/doc/libs/1_58_0/libs/serialization/doc/tutorial.html#archives

Обратите внимание на использование макроса НВП назвать элементы в архиве.

+0

Действительно ли это так, что XML быстрее, когда я перехожу к большему и большему размеру данных? – fromGiants

+0

Я не уверен, что понимаю вопрос. Если вы спрашиваете, уменьшаются ли относительные накладные расходы на декодирование тегов по мере увеличения размера каждого элемента, я полагаю, что ответ «да, незначительно», но на самом деле я не думаю, что скорость является главной проблемой при сериализации текстовый файл. –

+0

Ну, я хочу использовать эти методы для научных вычислительных целей. В некоторых случаях я буду хранить файлы меньшего размера с параметрами, но обычно я буду хранить кучу векторов/массивов с 10^6 или более элементами двойников. Моя интуиция подсказывает мне, что XML отлично подходит для прежнего приложения, но для последнего он невозмутимо медленный. Думаю, мне лучше взглянуть на HDF5 или NetCDF для последнего случая? – fromGiants

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