Fastinfoset 1с что это

Обновлено: 07.07.2024

Fast Infoset (или FI ) - это международный стандарт, определяющий формат двоичного кодирования для информационного набора XML ( XML Infoset ) в качестве альтернативы формату документа XML . Он призван обеспечить более эффективную сериализацию, чем текстовый формат XML.

FI по сути является сжатием без потерь , аналогичным gzip , для XML, за исключением того, что, хотя исходное форматирование потеряно, никакая информация не теряется при преобразовании из XML в FI и обратно в XML. В то время как целью сжатия является уменьшение физического размера данных, FI стремится оптимизировать как размер документа, так и производительность обработки.

Спецификация Fast Infoset определяется как ITU-T, так и ISO . FI официально определен в Рек. МСЭ-Т G. X.891 и ISO / IEC 24824-1 под названием Fast Infoset . Стандарт был опубликован ITU-T 14 мая 2005 г. и ISO 4 мая 2007 г. Стандартный документ Fast Infoset можно загрузить с веб-сайта ITU . Хотя документ не заявляет об ограничениях интеллектуальной собственности (IP) на реализацию или использование, страница ii предупреждает, что он получил уведомления, и тема может быть не полностью свободна от утверждений IP.

Распространенное заблуждение состоит в том, что FI требует поддержки инструментов ASN.1 . Хотя формальная спецификация использует нотацию ASN.1, стандарт включает нотацию управления кодированием (ECN), а инструменты ASN.1 не требуются для реализации.

Альтернативой FI является FleXPath.

СОДЕРЖАНИЕ

Состав

Базовый формат файла - ASN.1 с блоками тегов / длины / значения. Текстовые значения атрибутов и элементов хранятся с префиксами длины, а не с ограничителями конца, а для сегментов данных не требуется escape-последовательность для специальных символов. Эквивалент конечных тегов («терминаторы») нужны только в конце списка дочерних элементов. Двоичные данные передаются в собственном формате, и их не нужно преобразовывать в формат передачи, такой как base64 .

Fast Infoset - это формат более высокого уровня, основанный на формах и обозначениях ASN.1. Имена элементов и атрибутов хранятся в потоке октетов, в отличие от традиционных схем кодирования ASN.1. Следовательно, обычный XML-файл может быть восстановлен из двоичного потока без ссылки на XML-схему, и XML-схему не нужно выражать как определение ASN.1. («Теги» ASN.1 - это просто имена типов, например String, Integer или сложные типы.) ASN.1 вместе с ECN используется для определения формата файла.

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

Реализации

Эталонная реализация

Реализация Java спецификации FI доступен как часть GlassFish проекта. Библиотека имеет открытый исходный код и распространяется на условиях Apache License 2.0. Эта реализация используется в нескольких проектах, включая эталонную реализацию JAX-WS, используемую в GlassFish Metro . QtitanFastInfoset реализация на C ++ была доступна под коммерческой лицензией в качестве компонента для Qt рамок, до 2017 года .

Представление

Поскольку быстрые информационные наборы сжимаются как часть процесса генерации XML, они намного быстрее, чем использование алгоритмов сжатия в стиле Zip для потока XML, хотя выходные данные не так хорошо сжимаются.

Производительность синтаксического анализа типа SAX в Fast Infoset также намного выше, чем производительность синтаксического анализа XML 1.0, даже без какого-либо сжатия в стиле Zip. Типичное увеличение скорости синтаксического анализа, наблюдаемое для эталонной реализации Java , в 10 раз выше по сравнению с Java Xerces и в 4 раза по сравнению с драйвером Piccolo (один из самых быстрых анализаторов XML на основе Java).

Типичные области применения

Портативные устройства. Мобильные устройства обычно имеют соединения с низкой пропускной способностью для передачи данных и более медленные процессоры. Fast Infoset использует меньшую полосу пропускания, чем XML, и быстрее обрабатывается, что делает его лучшим выбором.

Хранение больших объемов данных - при хранении XML в файле или базе данных объем данных, создаваемых системой, часто может превышать разумные пределы, что имеет ряд недостатков: время доступа увеличивается по мере чтения большего количества данных, загрузка ЦП увеличивается по мере того, как XML-данные требуют больше мощности для обработки, и затраты на хранение растут. Сохраняя данные XML в формате Fast Infoset, объем данных можно уменьшить на 80 процентов.

Объекты чтения/записи XML, FastInfoset, HTML расширяют возможности чтения текстового файла встроенной обработкой тегов разметки.

Также они используются для объектов ПостроительDOM/ЗаписьDOM (см. далее) как источники данных.

Объекты ЧтениеFastInfoset 1С и ЗаписьFastInfoset 1С, ЧтениеHTML 1С и ЗаписьHTML 1С полностью аналогичны ЧтениеXML 1С и ЗаписьXML 1С и служат для работы таким же способом с другими форматами.

Файл XML 1С, который использовался в примерах







Текстовое значение


Пример 1. Считывание файла XML 1С в дерево значений с помощью ЧтениеXML 1С



//открываем файл XML 1С на чтение с помощью ЧтениеXML 1С
Файл = Новый ЧтениеXML();
Файл.ОткрытьФайл("D:\СтруктураКонфигурации.xml");

//подготовим дерево значений
//у каждой ветки XML может быть наименование, атрибуты и значение
дзXML = Новый ДеревоЗначений();
дзXML.Колонки.Добавить("Наименование");
дзXML.Колонки.Добавить("Значение");
дзXML.Колонки.Добавить("Атрибуты");

//так как атрибутов у строки XML может быть несколько - будем записывать их в таблицу значений
//каждый атрибут имеет имя и значение
тАтрибутов = Новый ТаблицаЗначений();
тАтрибутов.Колонки.Добавить("Имя");
тАтрибутов.Колонки.Добавить("Значение");

//уровень вложенности поможет нам понимать когда требуется добавить вложенную ветку, а когда нужно вернуться на уровень вверх
УровеньВложенности = 0;
//текущая строка - строка дерева, будет меняться при увеличении вложенности
ТекущаяСтрока = Неопределено;
//чтение файла XML 1С производится не построчно, а по структуре, при окончании файла чтение вернет ЛОЖЬ
Пока Файл.Прочитать() Цикл

//нас интересуют три вида узлов - начало элемента, текст (значение элемента) и конец элемента (чтобы вернуться на уровень вверх)
Если Файл.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
//в начале элемента увеличиваем уровень вложенности, в конце элемента уменьшаем
УровеньВложенности = УровеньВложенности + 1;

//если это первая строка, то добавим ее в самый верх дерева и сохраним только наименование
Если ТекущаяСтрока = Неопределено Тогда
ТекущаяСтрока = дзXML.Строки.Добавить();
ТекущаяСтрока.Наименование = Файл.Имя;
Продолжить;
Иначе
//вложенные строки
ТекущаяСтрока = ТекущаяСтрока.Строки.Добавить();
ТекущаяСтрока.Наименование = Файл.Имя; //сохраним наименование

//есть ли у этого элемента XML атрибуты?
Если Файл.КоличествоАтрибутов() > 0 Тогда
//если да - скопируем подготовленную пустую таблицу для сохранения атрибутов
тАтрибутыУзла = тАтрибутов.Скопировать();
//цикл по количеству атрибутов у этого элемента
Для Сч = 0 по Файл.КоличествоАтрибутов()-1 Цикл
//для каждого атрибута запомним имя и значение
Строка = тАтрибутыУзла.Добавить();
Строка.Имя = Файл.ИмяАтрибута(Сч);
Строка.Значение = Файл.ЗначениеАтрибута(Сч);
КонецЦикла;
//сохраним таблицу атрибутов элемента в текущую строку
ТекущаяСтрока.Атрибуты = тАтрибутыУзла;
КонецЕсли;
КонецЕсли;

ИначеЕсли Файл.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
//в начале элемента увеличиваем уровень вложенности, в конце элемента уменьшаем
УровеньВложенности = УровеньВложенности - 1;
//возвращаем текущую строку на уровень вверх
ТекущаяСтрока = ТекущаяСтрока.Родитель;

ИначеЕсли Файл.ТипУзла = ТипУзлаXML.Текст Тогда
//если у элемента есть значение - просто сохраним его
ТекущаяСтрока.Значение = Файл.Значение;

Пример 2. Запись файла 1С XML с помощью объекта ЗаписьXML 1С



//создаем файл ЗаписьXML 1С
Файл = Новый ЗаписьXML();
Файл.ОткрытьФайл("D:\СтруктураКонфигурации.xml", "UTF-8");
Файл.ЗаписатьНачалоЭлемента("Конфигурация");

//по метаданным обходим все справочники (подробнее см. "Работа с метаданными")
Для каждого Справочник из Метаданные.Справочники Цикл

//ЗаписатьНачалоЭлемента - открывает новую [подчиненную] ветку
Файл.ЗаписатьНачалоЭлемента("Справочник");
//ЗаписатьАтрибут - записывает атрибут в открытую ранее ветку
Файл.ЗаписатьАтрибут("Имя", Справочник.Имя);
Файл.ЗаписатьАтрибут("Синоним", Справочник.Синоним);

//по метаданным обходим все реквизиты справочника
Для каждого Реквизит из Справочник.Реквизиты Цикл
Файл.ЗаписатьНачалоЭлемента("Реквизит");
Файл.ЗаписатьАтрибут("Имя", Реквизит.Имя);
Файл.ЗаписатьАтрибут("Синоним", Реквизит.Синоним);
Файл.ЗаписатьКонецЭлемента();
КонецЦикла;

//по метаданным обходим все табличные части справочника
Для каждого ТЧ из Справочник.ТабличныеЧасти Цикл
Файл.ЗаписатьНачалоЭлемента("ТабличнаяЧасть");
Файл.ЗаписатьАтрибут("Имя", ТЧ.Имя);
Файл.ЗаписатьАтрибут("Синоним", ТЧ.Синоним);

Для каждого Реквизит из ТЧ.Реквизиты Цикл
Файл.ЗаписатьНачалоЭлемента("Реквизит");
Файл.ЗаписатьАтрибут("Имя", Реквизит.Имя);
Файл.ЗаписатьАтрибут("Синоним", Реквизит.Синоним);
Файл.ЗаписатьКонецЭлемента();
КонецЦикла;

//ЗаписатьКонецЭлемента - "закрывает" открытую ранее с помощью ЗаписатьНачалоЭлемента ветку
Файл.ЗаписатьКонецЭлемента();
КонецЦикла;

Fast Infoset (или FI ) - это международный стандарт, определяющий формат двоичного кодирования для информационного набора XML ( XML Infoset ) в качестве альтернативы формату документа XML . Он призван обеспечить более эффективную сериализацию, чем текстовый формат XML.

FI по сути является сжатием без потерь , аналогичным gzip , для XML, за исключением того, что, хотя исходное форматирование потеряно, никакая информация не теряется при преобразовании из XML в FI и обратно в XML. В то время как целью сжатия является уменьшение физического размера данных, FI стремится оптимизировать как размер документа, так и производительность обработки.

Спецификация Fast Infoset определяется как ITU-T, так и ISO . FI официально определен в Рек. МСЭ-Т G. X.891 и ISO / IEC 24824-1 под названием Fast Infoset . Стандарт был опубликован ITU-T 14 мая 2005 г. и ISO 4 мая 2007 г. Стандартный документ Fast Infoset можно загрузить с веб-сайта ITU . Хотя документ не заявляет об ограничениях интеллектуальной собственности (IP) на реализацию или использование, страница ii предупреждает, что он получил уведомления, и тема может быть не полностью свободна от утверждений IP.

Распространенное заблуждение состоит в том, что FI требует поддержки инструментов ASN.1 . Хотя формальная спецификация использует нотацию ASN.1, стандарт включает нотацию управления кодированием (ECN), а инструменты ASN.1 не требуются для реализации.

Альтернативой FI является FleXPath.

СОДЕРЖАНИЕ

Состав

Базовый формат файла - ASN.1 с блоками тегов / длины / значения. Текстовые значения атрибутов и элементов хранятся с префиксами длины, а не с ограничителями конца, а для сегментов данных не требуется escape-последовательность для специальных символов. Эквивалент конечных тегов («терминаторы») нужны только в конце списка дочерних элементов. Двоичные данные передаются в собственном формате, и их не нужно преобразовывать в формат передачи, такой как base64 .

Fast Infoset - это формат более высокого уровня, основанный на формах и обозначениях ASN.1. Имена элементов и атрибутов хранятся в потоке октетов, в отличие от традиционных схем кодирования ASN.1. Следовательно, обычный XML-файл может быть восстановлен из двоичного потока без ссылки на XML-схему, и XML-схему не нужно выражать как определение ASN.1. («Теги» ASN.1 - это просто имена типов, например String, Integer или сложные типы.) ASN.1 вместе с ECN используется для определения формата файла.

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

Реализации

Эталонная реализация

Реализация Java спецификации FI доступен как часть GlassFish проекта. Библиотека имеет открытый исходный код и распространяется на условиях Apache License 2.0. Эта реализация используется в нескольких проектах, включая эталонную реализацию JAX-WS, используемую в GlassFish Metro . QtitanFastInfoset реализация на C ++ была доступна под коммерческой лицензией в качестве компонента для Qt рамок, до 2017 года .

Представление

Поскольку быстрые информационные наборы сжимаются как часть процесса генерации XML, они намного быстрее, чем использование алгоритмов сжатия в стиле Zip для потока XML, хотя выходные данные не так хорошо сжимаются.

Производительность синтаксического анализа типа SAX в Fast Infoset также намного выше, чем производительность синтаксического анализа XML 1.0, даже без какого-либо сжатия в стиле Zip. Типичное увеличение скорости синтаксического анализа, наблюдаемое для эталонной реализации Java , в 10 раз выше по сравнению с Java Xerces и в 4 раза по сравнению с драйвером Piccolo (один из самых быстрых анализаторов XML на основе Java).

Типичные области применения

Портативные устройства. Мобильные устройства обычно имеют соединения с низкой пропускной способностью для передачи данных и более медленные процессоры. Fast Infoset использует меньшую полосу пропускания, чем XML, и быстрее обрабатывается, что делает его лучшим выбором.

Хранение больших объемов данных - при хранении XML в файле или базе данных объем данных, создаваемых системой, часто может превышать разумные пределы, что имеет ряд недостатков: время доступа увеличивается по мере чтения большего количества данных, загрузка ЦП увеличивается по мере того, как XML-данные требуют больше мощности для обработки, и затраты на хранение растут. Сохраняя данные XML в формате Fast Infoset, объем данных можно уменьшить на 80 процентов.


Для работы с текстовыми файлами в 1С предназначен объект ТекстовыйДокумент:

Для добавления строк в конец текстового документа используется метод ДобавитьСтроку. Параметром нужно передать добавляемую строку:

Для записи текстового документа в файл на диск нужно вызвать метод НачатьЗапись и вторым параметром указать путь к файлу:

Пример записи текстового файла с тремя строками:

В результате будет получен следующий файл:


Метод НачатьЗапись является асинхронным и может быть использован только на клиенте. При необходимости первым параметром можно указать описание оповещения с именем процедуры, которая будет вызвана после записи текстового файла:

ПослеЗаписи = Новый ОписаниеОповещения ( "ПослеЗаписи" , ЭтотОбъект ) ; Процедура ПослеЗаписи ( Результат , ДопПараметры ) Экспорт

Есть аналогичный асинхронный метод ЗаписатьАсинх, который использует асинхронность через обещания:

Для записи текстового файла на сервере используется синхронный метод Записать:

С помощью метода УстановитьТекст можно сразу установить весь текст:

Кодировка текстового файла

По умолчанию текстовый файл записывается в кодировке UTF-8. При необходимости кодировку можно изменить, указав в методе НачатьЗапись третий параметр:

ТекстДок . НачатьЗапись ( ПослеЗаписи , ПутьКФайлу , "UTF-16LE" ) ; ТекстДок . НачатьЗапись ( ПослеЗаписи , ПутьКФайлу , "UTF-16BE" ) ; ТекстДок . НачатьЗапись ( ПослеЗаписи , ПутьКФайлу , "windows-1251" ) ;

Если нужно записать в кодировке UCS-2LE или UCS-2BE, то нужно указать UTF-16LE или UTF-16BE. Это почти что одно и то же.

Список всех возможных кодировок можно посмотреть в синтакс-помощнике.

Кодировку текста можно указать не только строкой, но и с помощью системного перечисления КодировкаТекста:

ТекстДок . НачатьЗапись ( ПослеЗаписи , ПутьКФайлу , КодировкаТекста . Системная ) ;

Возможные значения перечисления:

Чтение текстового файла

Чтобы прочитать текстовый файл можно воспользоваться методом НачатьЧтение. Первым параметром нужно передать описание оповещения с именем процедуры, которая будет вызвана после прочтения файла, вторым параметром нужно указать путь к файлу.

Для получения текста нужно вызвать метод ПолучитьТекст, который прочитает текстовый файл в одну строку. Так как метод НачатьЧтение является асинхронным, то получать текст нужно в процедуре из описания оповещения. Для этого объект ТекстовыйДокумент передается через параметр описания оповещения:

ПослеЧтения = Новый ОписаниеОповещения ( "ПослеЧтения" , ЭтотОбъект , ТекстДок ) ;

Кодировка текста определяется автоматически из файла. Если кодировку не получится определить, то будет использоваться кодировка UTF-8. При необходимости можно указать требуемую кодировку третьим параметром:

ТекстДок . НачатьЧтение ( ПослеЧтения , ПутьКФайлу , "UTF-8" ) ;

Есть аналогичный асинхронный метод ПрочитатьАсинх, который вместо описания оповещения использует обещание:

При чтении файла на сервере можно воспользоваться синхронным методом Прочитать:

С помощью метода КоличествоСтрок можно узнать количество строк текстового файла, а методом ПолучитьСтроку, вызываемом в цикле, можно прочитать файл построчно:

ПослеЧтения = Новый ОписаниеОповещения ( "ПослеЧтения" , ЭтотОбъект , ТекстДок ) ;

Работа со строками текстового документа

В результате будет получен такой текстовый файл:


Если первым параметром указать номер строки, которой еще не существует в текстовом документе, то строка будет просто вставлена в конец документа.


С помощью метода УдалитьСтроку можно удалить строку из текстового документа. Параметром нужно указать номер удаляемой строки:

Методом Очистить можно полностью очистить текстовый документ:

Интерактивное редактирование текстового файла

После чтения текстового файла можно открыть его для интерактивного редактирования. Для этого используется метод Показать:

ПослеЧтения = Новый ОписаниеОповещения ( "ПослеЧтения" , ЭтотОбъект , ТекстДок ) ;

В результате в 1С будет открыт редактор текстового документа:


Первым параметром можно переопределить заголовок окна, а вторым указать имя файла, под которым будет предложено сохранить текстовый файл после его редактирования:

//передаем тектовый документ и имя файла через доп. параметры ПослеЧтения = Новый ОписаниеОповещения ( "ПослеЧтения" , ЭтотОбъект , ДопПараметры ) ;

В результате после редактирования текстового документа будет предложено сохранить его:


Если согласиться, то изменения автоматически будут записаны в тот файл, который был указан вторым параметром.

Разделитель строк

При записи текстового документа средствами платформы 1С символ LF преобразуется в символы CR и LF. При чтении выполняется обратное преобразование CR и LF в LF.

При необходимости преобразования можно переопределить в методах НачатьЗапись и НачатьЧтение:

ТекстДок . НачатьЧтение ( ПослеЧтения , ПутьКФайлу , , Разделитель ) ;

То есть в методе НачатьЗапись указывается символ, в который будет выполнено преобразование символа LF. А в методе НачатьЧтение указывается символ, который нужно преобразовать в символ LF.

Можно указывать только следующие символы:

Если нужно использовать CR и LF, то параметр можно не указывать.

Последовательный доступ к файлу

Объект Текстовый документ при чтении загружает весь текстовый файл в память компьютера. Если файл большой, то памяти может не хватить.

Для решения данной проблемы можно использовать объекты последовательного доступа к текстовым файлам: ЗаписьТекста и ЧтениеТекста. Данные объекты загружают в память только определенный фрагмент текста, с которым в данный момент идет работа.

Читайте также: