Fastinfoset 1с что это
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, то параметр можно не указывать.
Последовательный доступ к файлу
Объект Текстовый документ при чтении загружает весь текстовый файл в память компьютера. Если файл большой, то памяти может не хватить.
Для решения данной проблемы можно использовать объекты последовательного доступа к текстовым файлам: ЗаписьТекста и ЧтениеТекста. Данные объекты загружают в память только определенный фрагмент текста, с которым в данный момент идет работа.
Читайте также: