PIBinaryStream представляет собой интерфейс бинарной сериализации. Не может быть использован в чистом виде, только в виде миксина или готовых классов: PIByteArray и PIIOBinaryStream.
Используется для сохранения или чтения любых данных. Простые типы читаются/пишутся как блоки памяти, если не созданы конкретные операторы. Сложные типы (нетривиальные) обязаны иметь операторы ввода/вывода, иначе возникнет ошибка компиляции.
Также поддерживаются контейнеры с типами по таким же правилам.
Перечисления интерпретируются как int, логические типы как один байт.
Операторы сохранения добавляют данные в конец потока, а операторы извлечения берут данные из его начала.
Для облегчения написания операторов есть макросы:
- BINARY_STREAM_FRIEND(T) - объявить операторы с доступом к приватному содержимому типа T, необязателен;
- BINARY_STREAM_WRITE(T) - запись в поток, "s" - объект потока, "v" - объект типа T;
- BINARY_STREAM_READ(T) - чтение из потока, "s" - объект потока, "v" - объект типа T.
Пример:
class MyType {
BINARY_STREAM_FRIEND(MyType);
public:
void setInt(int v) {m_i = v;}
int getInt() const {return m_i;}
PIString getString()
const {
return m_s;}
private:
int m_i = 0;
};
BINARY_STREAM_WRITE(MyType) {s << v.m_i << v.m_s; return s;}
BINARY_STREAM_READ (MyType) {s >> v.m_i >> v.m_s; return s;}
int main(int argc, char * argv[]) {
MyType t_read, t_write;
t_write.setInt(10);
t_write.setString("text");
data << t_write;
data >> t_read;
piCout << t_read.getInt() << t_read.getString();
}
Класс PIByteArray представляет собой массив байтов.
Definition: pibytearray.h:42
Класс строки.
Definition: pistring.h:42
#define piCout
Макрос для условного (piDebug) вывода в PICout(StdOut)
Definition: picout.h:35
Результат:
0a000000040000007400650078007400
10 text
Для сохранения/извлечения блоков произвольных данных используется класс PIMemoryBlock. Потоковые операторы для него просто сохраняют/извлекают блоки байтов в/из потока:
float a_read[10], a_write[10];
for (int i = 0; i < 10; ++i) {
a_read [i] = 0.f;
a_write[i] = i / 10.f;
}
for (int i = 0; i < 10; ++i)
Вспомогательная структура для сохранения/извлечения произвольного блока данных в/из PIBinaryStream.
Definition: pimemoryblock.h:35
Результат:
00000000cdcccc3dcdcc4c3e9a99993ecdcccc3e0000003f9a99193f3333333fcdcc4c3f6666663f
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
Если при чтении из потока не хватило данных (например, закончился массив или файл), то проверка объекта потока на wasReadError() вернёт true. Рекомендуется делать эту проверку после чтения данных для корректной обработки ошибки.