Какие типы могут быть отображены в TLV?

Какие правила и ограничения существуют для наследования?

Допускается ли множественное наследование?

Как быть, если в базовом и производном типах есть атрибуты, являющиеся одним и тем же TLV?

Как быть, если атрибут является указателем, но должен быть обязательным? Или наоборот: атрибут не является указателем и не является обязательным атрибутом?

Как быть с абстрактными типами?

Как описывать отображение схемы данных в TLV.

Правила отображения схемы данных в TLV.

Что получается в результате трансляции описания отображения схемы данных в TLV?


Сериализованным в TLV может быть только тип, содержимое которого принадлежит к одному из следующих случаев:

Т.о. получаются следующие категории отображаемых в TLV типов:

empty
Пустой тип.
primitive
Атрибутами являются только примитивные объекты или фиксированные вектора примитивных объектов.
complex
Атрибутами являются одиночные объекты определенных пользователем типов.
container
Единственный атрибут - контейнер. Элементом контейнера может быть одиночный объект либо примитивного, либо пользовательского типа.

Наследование возможно, если категории базовых и производных типов соотносятся следующим образом (указывается категория базового типа и допустимые категории производных типов, в скобках отмечается категория результирующего типа):

empty
empty (empty), primitive (primitive), complex (complex), container (container);
primitive
empty (primitive), primitive (primitive);
complex
complex (complex);
container
empty (container).

Множественное наследование не допускается.

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


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


При наследовании в базовых и производных классах не должно быть атрибутов, отображаемых в один и тот же TLV. Для атрибутов не указателей это означает, что в базовом и производном типе не должно быть атрибутов, имеющих один и тот же пользовательский тип. Для атрибутов-указателей это означает, что в базовом и производном типе не должно быть атрибутов, тип которых относится к одному семейству классов. Под семейством понимаются классы, имеющих общего предка.


Не реализовано. Оставлено для будующих реализаций.
Чтобы объявить атрибут-указатель обязательным атрибутом необходимо использовать специальные теги в описании отображения типа:

{type имя-типа
	{mandatory-attr имя-обязательного-атрибута}
}

Объявить атрибут-не указатель необязательным атрибутом нельзя. Объясняется это тем, что при сериализации нельзя определить, должен ли сериализироваться необязательный атрибут или не должен.


Для отображения схемы данных в TLV необходимо создать описание отображения следующего формата.

{tlv-params
	{tag-type
		( oess_1::uchar_t |
		  oess_1::ushort_t |
		  oess_1::uint_t ) }

	{length-type
		( oess_1::uchar_t |
		  oess_1::ushort_t |
		  oess_1::uint_t ) }

	{i-class имя-класса-десериализатора
		[{cpp-namespace имя-пространства-имен-C++}]
	}
	{o-class имя-класса-сериализатора
		[{cpp-namespace имя-пространства-имен-C++}]
	}
}

[ {type имя-типа-схемы
	{tag целочисленное-значение }
} ]*

Примеры:
mobilling
smsg


Для отображаемых в TLV типов существуют следующие ограничения:


Результатом трансляции описания отображения схемы данных в TLV являются два C++ класса: один для сериализации, другой для десериализации сущности. Имена классов задаются в описании отображения (теги i-class и o-class).

Для сериализации/десериализации объектов в/из TLV должны применяться объекты сгенерированных классов. Например, если в tlv-map указывается:

{tlv-params
	{tag-type	oess_1::uchar_t}
	{length-type	oess_1::uint_t}

	{i-class	itlv_t }
	{o-class	otlv_t }
}

То в программе на C++:

// Сериализация объекта.
tlv_my_t my_tlv;
otlv_t oent( ... );
oent << my_tlv;

// Десериализация объекта.
tlv_my_t my_tlv;
itlv_t ient( ... );
ient >> my_tlv;