Я сейчас имею дело с EXI.
Нет хорошего универсального инструмента для обработки EXI. Как только вы разберетесь в EXI, вы поймете, что в двоичном потоке есть куча ненужных разделителей, которые абсолютно и совершенно не нужны для схемы. Отчасти это смешно.
Как вы думаете, будет ли закодировано следующее в EXI, если указаны оба значения?
<xs:complexType name="example">
<xs:sequence>
<xs:element name="bool1" type="xs:boolean" minOccurs="0" />
<xs:element name="bool2" type="xs:boolean" minOccurs="0" />
</xs:sequence>
</xs:complexType>
Как вы думаете, это может быть максимум 4 бита? 1 бит, чтобы указать, определен ли bool1, и что значение bool1, а затем еще один бит, чтобы указать, определен ли bool2, тогда значение bool2?
Боже, нет!
Хорошо, позвольте мне рассказать вам, мальчики и девочки! Вот как это на самом деле кодируется
+---- A value of 0 means this element (bool1) is not specified,
| 1 indicates it is specified
|+--- A value of x means this element is undefined,
|| 0 means the bool is set to false, 1 is set to true
||+-- A value of 0 means this element (bool2) is not specified,
||| 1 indicates it is specified
|||+- A value of x means this element is undefined
|||| 0 means the bool is set to false, 1 is set to true
||||
0x0x 4 0100 # neither bools are specified
0x10 8 00100000 # bool1 is not specified, bool2 is set to false
0x11 8 00101000 # bool1 is not specified, bool2 is set to true
100x 9 000000010 # bool1 is set to false, bool2 is not specified
110x 9 000010010 # bool1 is set to true, bool2 is not specified
1010 13 0000000000000 # bool1 is set to false, bool2 is set to false
1011 13 0000000001000 # bool1 is set to false, bool2 is set to true
1110 13 0000100000000 # bool1 is set to true, bool2 is set to false
1111 13 0000100001000 # bool1 is set to true, bool2 is set to true
^ ^
+-encoding--+
Which can be represented with this tree
0-0-0-0-0-0-0-0-0-0-0-0-0 (1010)
\ \ \ \ \
| | | | 1-0-0-0 (1011)
| | | |
| | | 1-0 (100x)
| | |
| | 1-0-0-0-0-0-0-0-0 (1110)
| | \ \
| | | 1-0-0-0 (1111)
| | |
| | 1-0 (110x)
| |
| 1-0-0-0-0-0 (0x10)
| \
| 1-0-0-0 (0x11)
|
1-0-0 (0x0x)
Минимум 4 бита, МИНИМАЛЬНЫЙ, чтобы не определять ни того, ни другого. Теперь я немного несправедлив, потому что я включаю разделители - разделители, которые совершенно не нужны.
Теперь я понимаю, как это работает. Вот спецификация:
https://www.w3.org/TR/exi/
Приятного чтения! Это было БОЛЬШОЕ ДЕЛО ФУНДАМЕНТА ДЛЯ МЕНЯ !!!! @@ ##! @
Теперь это только со схемой, и спецификация EXI специально говорит, что вы все еще можете кодировать XML, который НЕ соответствует схеме. Что весело, потому что это должно быть для маленьких маленьких веб-устройств. Что вы делаете с неожиданными данными, которые у вас нет условий для обработки во встроенном устройстве?
Да ведь ты просто умрешь, конечно. Там нет восстановления для чего-то, что вы не ожидаете. У этих вещей нет экрана, мне повезло, если я могу войти в него через последовательный порт.
Я использовал 4 разных генератора XSD / парсеры / генераторы XML. 3 из них задыхаются от схемы, которую я должен использовать. Маршалинг данных для C и C ++ (помните, что для системы EMBEDDED с очень небольшим объемом памяти и процессорной мощностью) ужасен.
XSD описывает в основном структуру или архитектуру классов, и я не могу найти ни одного инструмента, который бы просто создавал классы. Пример XSD, который я привел выше, должен создать структуру с 4 bools, 2 bools - значения, а 2 bools указывают, определены ли они вообще.
Но ЭТО существует? Ну, черт возьми, нет.
Мне нравится XML для описания документов. На самом деле я делаю - но вот что я ненавижу в XML - для широко принятого стандарта, доступные инструменты для него абсолютно ужасны. Просто читать схему сложно, если она распространяется по нескольким пространствам имен и документам.
Rant rant, huff huf
Единственная причина, по которой мы используем это, - настаивал на этом какой-то комитет по стандартам. То, что это сделано, - это создание монополии для небольшой группы компаний, которая уже внедрила это, и это единственная цель.
EXI не является общепринятым стандартом, XML - плохой инкапсулятор для числовых данных, и его сложно реализовать, и для него нет достойных инструментов. EXIP имеет версию 5.0 - все, что работает с открытым исходным кодом, находится на Java - по крайней мере, у меня это есть.
Для моей сферы деятельности EXI - просто плохое дизайнерское решение. Я работал над множеством протоколов связи в различных встроенных системах. Я работал над DOCSIS, который используют все современные кабельные модемы - они используют простой и расширяемый протокол Type / Length / Value с положениями для работы с нераспознанными типами - именно поэтому длина всегда включена. Это просто, для реализации всего стека требуется буквально дни.
EXI очень сложен в написании кода, для него нет достойных процессоров, и, что хуже всего, все процессоры, которые я нашел, действительно работают с ним, просто преобразуйте его из EXI <-> XML - который полностью бесполезно.
Я прибег к написанию собственного синтаксического анализатора XSD, а это значит, что я должен понять, по крайней мере, всю спецификацию XML для тех частей этого проекта, которые его используют - и это обширно. То, что заняло бы у меня 2 недели, чтобы справиться с какой-либо разумной спецификацией, заняло у меня 10. Никто в моем мире не собирается использовать это, если оно не сдвинуло их горло и не должно, это квадратный колышек для круглого отверстия. *