В самых первых версиях ObjESSty было принято не очень удачное решение о том, как сохранять размерности контейнеров и размеры объектов в двоичных потоках oess_1::io. Для хранения размерности в поток всегда помещалось 32-х битовое значение. Даже в случаях, когда в контейнере не было ни одного элемента, либо всего несколько элементов (т.к. когда для сохранения размерности было достаточно одного байта).
К сожалению, на практике оказалось, что такой способ хранения размерностей слишком расточителен, т.к. в большинстве случаев для хранения размера требовался всего один байт. Но поменять текущее решение нельзя не нарушая совместимость с уже существующими и эксплуатирующимися системами.
Однако, для новых задач и, возможно, новых типов сериализации, следует учесть данную ошибку и не повторять ее впредь. Для этого в oess_1::defs определен новый тип oess_1::defs::quantity_t для которого будут реализовываться эффективные способы сериализации.
Потоки oess_1::io::ibinstream_t и oess_1::io::obinstream_t используют для представления oess_1::defs::quantity_t способ из ASN1 BER:
- если значение размерности меньше или равно 127, то значение храниться в одном байте;
- если значение больше 127, то первый байт хранит количество байт с двоичным образом размерности. При этом старший, седьмой, бит первого байта установлен в единицу, а биты с шестого по нулевой содержат количество байт, расположенных следом.
Так, если размерность равна 8, то она будет сохраненена в виде одного байта 0x08. Если размерность равна 127, то она будет сохранение в виде одного байта: 0x7f. Значение 128 будет сохранено как 0x81 0x80. Значение 256 -- 0x82 0x01 0x00.
Текущая реализация oess_1::io::ibinstream_t не может десериализовать quantity_t для хранения которого используется больше четырех байт (без байта длины представления), поскольку для хранения размерности используется 32-х битовое значение.
При обнаружении такого большого значения quantity_t порождается исключение oess_1::physic_ex_t с кодом ошибки oess_1::io::err::c_quantity_image_too_long.
Документация по ObjESSty. Последние изменения: Fri Oct 13 18:35:37 2006. Создано системой
1.4.7