Маршаллинг (информатика) - Википедия - Marshalling (computer science)

В Информатика, сортировка или же маршалинг (Орфография США ) - это процесс преобразования представления памяти объекта объект в формат данных, подходящий для хранения или передачи,[нужна цитата ] и обычно используется, когда данные необходимо перемещать между различными частями компьютерной программы или из одной программы в другую. Маршаллинг похож на сериализация и используется для связи с удаленными объектами с помощью объекта, в данном случае сериализованного объекта. Он упрощает сложное общение, используя составные объекты для связи вместо примитивы. Обратный маршаллингу называется демаршаллинг (или же демаршаллинг, похожий на десериализация). Интерфейс немаршаллинга принимает сериализованный объект и преобразует его во внутреннюю структуру данных, которую можно назвать исполняемый файл.

Определение маршаллинга различается. Python, Ява, и .СЕТЬ. В некоторых контекстах он используется как синоним сериализации.

Сравнение с сериализацией

К "сериализовать "объект означает преобразование своего состояния в поток байтов таким образом, чтобы поток байтов можно было преобразовать обратно в копию объекта.

Термин «маршал» используется для обозначения определенного типа «сериализации» в стандартной библиотеке Python.[1] - хранение внутренних объектов Python:

Модуль marshal существует в основном для поддержки чтения и записи «псевдо-скомпилированного» кода для модулей Python файлов .pyc.

...

Если вы сериализуете и десериализируете объекты Python, используйте вместо этого модуль pickle

— Стандартная библиотека Python[2]

В связанном с Java RFC 2713, маршаллинг используется при сериализации объектов для удаленного вызова. Маршалируемый объект записывает состояние исходного объекта и содержит кодовую базу (кодовая база здесь относится к списку URL-адресов, из которых может быть загружен объектный код, а не к исходному коду). Следовательно, чтобы преобразовать состояние объекта и кодовую базу (и), необходимо выполнить демаршаллинг. Интерфейс демаршаллера автоматически преобразует упорядоченные данные, содержащие кодовую базу (и), в исполняемый объект Java в JAXB. Любой объект, который можно десериализовать, можно неупорядочить. Однако обратное не обязательно.

«Маршалировать» объект означает записывать его состояние и кодовую базу (и) таким образом, чтобы, когда упорядоченный объект «неупорядочен», была получена копия исходного объекта, возможно, путем автоматической загрузки определений класса объекта. Вы можете маршалировать любой объект, который является сериализуемым или удаленным (то есть реализует интерфейс java.rmi.Remote). Маршаллинг похож на сериализацию, за исключением того, что маршаллинг также записывает кодовые базы. Маршаллинг отличается от сериализации тем, что он специально обрабатывает удаленные объекты.

...

Любой объект, методы которого могут быть вызваны [для объекта на другой виртуальной машине Java], должен реализовывать интерфейс java.rmi.Remote. Когда такой объект вызывается, его аргументы упорядочиваются и отправляются с локальной виртуальной машины на удаленную,

где аргументы неупорядочиваются и используются.

— Схема для представления объектов Java (tm) в каталоге LDAP (RFC 2713 )[3]

В Microsoft .NET маршаллинг также используется для обозначения сериализации при использовании удаленных вызовов:

Когда вы маршалируете объект по значению, копия объекта создается и сериализуется на сервер. Любые вызовы методов, сделанные для этого объекта, выполняются на сервере.

— Как маршалировать объект на удаленный сервер по значению с помощью Visual Basic .NET (Q301116)[4]

использование

Маршаллинг используется в реализациях различных удаленный вызов процедур (RPC) механизмы, в которых необходимо передавать данные между процессы и / или между потоки. В Microsoft Компонентная объектная модель (COM) указатели интерфейсов должны быть упорядочены при пересечении границ COM-подразделения.[5][6] в .NET Framework, преобразование между неуправляемым типом и CLR типа, как в P / Invoke процесс, также является примером действия, которое требует упорядочивания.[7]

Кроме того, маршаллинг широко используется в скриптах и ​​приложениях, использующих XPCOM технологии, предоставляемые в рамках Фреймворк приложения Mozilla. В Mozilla Firefox браузер - популярное приложение, построенное на этой платформе, которое дополнительно позволяет языки сценариев использовать XPCOM через XPConnect (Cross-Platform Connect).

Пример

в Майкрософт Виндоус семейство операционных систем весь набор драйверов устройств для Direct3D являются драйверами режима ядра. Часть пользовательского режима API обрабатывается средой выполнения DirectX, предоставленной Microsoft.

Это проблема, потому что для вызова операций режима ядра из пользовательского режима требуется выполнение системный вызов, и это неизбежно вынуждает ЦПУ перейти в "режим ядра". Это медленная операция, требующая порядка микросекунды завершить.[8] В это время ЦП не может выполнять никаких операций. Таким образом, минимизация количества раз, когда эта операция переключения должна выполняться, в значительной степени оптимизирует производительность.

Драйверы Linux OpenGL разделены на две части: драйвер ядра и драйвер пользовательского пространства. Драйвер пользовательского пространства выполняет весь перевод OpenGL команды в машинный код для отправки GPU. Чтобы уменьшить количество системных вызовов, драйвер пользовательского пространства реализует маршалинг. Если графический процессор буфер команд заполнен данными рендеринга, API может просто сохранить запрошенный вызов рендеринга во временном буфере, и, когда буфер команд близок к пустому, он может выполнить переключение в режим ядра и добавить несколько сохраненных команд одновременно .

Форматы

XML объекты - одно из средств передачи данных между системами. Microsoft, например, использует его в качестве основы для форматов файлов различных компонентов (Word, Excel, Access, PowerPoint и т. Д.) Пакета Microsoft Office: см. Office Open XML. Хотя это обычно приводит к более длинному (т.е. более подробному) формату передачи сообщений, полностью заключенный в квадратные скобки синтаксис XML «start-tag», «end-tag» позволяет обеспечить более точную диагностику и более легкое восстановление после ошибок передачи или диска. Кроме того, поскольку теги повторяются по всему объекту, можно использовать стандартные методы сжатия для сжатия объекта: все форматы файлов Office создаются с использованием алгоритма ZIP на необработанном XML.[9]

Альтернативные форматы, такие как JSON (объектная нотация JavaScript), более лаконичны - JSON использует фигурные скобки вместо начальных / конечных тегов - но, соответственно, менее надежны для восстановления после ошибок.

После передачи данных обратно в программу или приложение их необходимо преобразовать обратно в исполняемый объект для использования. Следовательно, немаршаллинг обычно используется на стороне получателя реализаций Вызов удаленного метода (RMI) и Удаленный вызов процедур (RPC) механизмы демаршалинга переданных объектов в исполняемой форме.

JAXB

JAXB или же Ява Архитектура для Привязка XML - это наиболее распространенный фреймворк, используемый разработчиками для маршалинга и демаршалинга Java-объектов. JAXB обеспечивает взаимное преобразование между основными типами данных, поддерживаемыми Java, и стандартными Схема XML типы данных.[10]

XmlSerializer

XmlSerializer - это платформа, используемая C # разработчикам маршалировать и демаршалировать объекты C #. Одно из преимуществ C # над Java состоит в том, что C # изначально поддерживает маршаллинг благодаря включению класса XmlSerializer. С другой стороны, Java требует неродного клей код в форме JAXB для поддержки маршалинга.[11]

XML и исполняемое представление

Примером демаршалинга является преобразование XML-представления объекта в представление объекта по умолчанию на любом языке программирования. Рассмотрим следующий класс.

общественный учебный класс Ученик{    частный char имя[50];    частный int Я БЫ;    общественный Нить getName()    {        возвращаться это.имя;    }    общественный int getID()    {        возвращаться это.Я БЫ;    }    пустота Имя набора(Нить имя)    {        это.имя = имя;    }    пустота установить идентификатор(int Я БЫ)    {        это.Я БЫ = Я БЫ;    }}
  • XML-представление Ученик объект:
<!-- Code Snippet: 1 --><?xml version = “1.0” encoding = “UTF-8”?>    <студент id = “11235813”>        <name>Джаяраман</name>    </student>    <студент id = “21345589”>        <name>Шьям</name>    </student>
  • Исполняемое представление Ученик объект:
// Фрагмент кода: 2Ученик s1 = новый Ученик();s1.установить идентификатор(11235813);s1.Имя набора(«Джаяраман»);Ученик s2 = новый Ученик();s2.установить идентификатор(21345589);s2.Имя набора("Шьям");

Преобразование XML-представления объектов, созданных фрагментом кода 1, в исполняемое Java-представление по умолчанию для объектов, созданных фрагментом кода 2, называется демаршалингом.

Демаршаллинг в Java

Unmarshaller в JAXB

Процесс демаршалинга XML-данных в исполняемый объект Java берет на себя встроенный класс Unmarshaller. Это также подтверждает данные XML по мере их упорядочивания. Методы демаршалирования, определенные в классе Unmarshaller: перегружен для различных типов входных XML-данных. Некоторые из важных реализаций немаршалированных методов:[12]

  • Немаршалинг из файла XML:
JAXBContext jcon = JAXBContext.newInstance( "com.acme.foo" );Unmarshaller Умар = jcon.createUnmarshaller();Объект объект = Умар.демаршировать( новый Файл( "input.xml" ) );
  • Немаршалинг из XML-файла в InputStream:
InputStream istr = новый FileInputStream( "input.xml" );JAXBContext jcon = JAXBContext.newInstance( "com.acme.foo" );Unmarshaller Умар = jcon.createUnmarshaller();Объект объект = Умар.демаршировать( istr );
  • Немаршалинг из XML-файла в URL:
JAXBContext jcon = JAXBContext.newInstance( "com.acme.foo" );Unmarshaller Умар = jcon.createUnmarshaller();URL url = новый URL( "http: //merrilllynch.employee/input.xml" );Объект объект = Умар.демаршировать( url );

Немаршалинг XML-данных

Методы немаршалирования могут десериализовать весь XML-документ или небольшую его часть. Когда корневой элемент XML объявлен глобально, эти методы используют отображение JAXBContext корневых элементов XML на сопоставленные классы JAXB для инициации демаршалинга. Если сопоставлений недостаточно и корневые элементы объявляются локально, методы немаршалинга используют методы объявленного типа для процесса немаршалинга. Эти два подхода можно понять ниже.[12]

Размаршалировать глобальный корневой элемент XML

Метод unmarshal использует JAXBContext для демаршалирования данных XML, когда корневой элемент объявлен глобально. Объект JAXBContext всегда поддерживает отображение глобально объявленного элемента XML и его имени в сопоставленный класс JAXB. Если имя элемента XML или его @xsi: тип соответствует сопоставленному классу JAXB, метод немаршалирования преобразует XML-данные с использованием соответствующего сопоставленного класса JAXB. Однако, если имя элемента XML не соответствует, процесс демаршализации прервется и выдаст сообщение UnmarshalException. Этого можно избежать, используя методы unmarshal by declareType.[13]

Отменить маршалинг локального корневого элемента XML

Когда корневой элемент не объявлен глобально, приложение помогает демаршаллеру с помощью сопоставления, предоставляемого приложением, с использованием параметров объявленного типа. В порядке приоритета, даже если корневое имя имеет сопоставление с соответствующим классом JAXB, объявленный тип переопределяет сопоставление. Однако если @xsi: тип Атрибут XML-данных имеет сопоставление с соответствующим классом JAXB, тогда он имеет приоритет над параметром объявленного типа. Методы демаршалирования с помощью параметров объявленного типа всегда возвращают JAXBElement пример. Свойства этого экземпляра JAXBElement устанавливаются следующим образом:[14]

Свойство JAXBElementЦенить
имяимя элемента xml
ценитьinstanceof объявленный тип
объявленный типнемаршалный метод объявленный тип параметр
объемноль (фактический размер не известен)

Смотрите также

Рекомендации

  1. ^ "маршал - Внутренняя сериализация объекта Python". Фонд программного обеспечения Python. Получено 4 ноября 2016.
  2. ^ "маршал - Внутренняя сериализация объекта Python". Фонд программного обеспечения Python. Получено 9 октября 2019.
  3. ^ «Схема для представления объектов Java (tm) в каталоге LDAP». IETF. Октябрь 1999 г.. Получено 4 ноября 2016.
  4. ^ «Как маршалировать объект на удаленный сервер по значению с помощью Visual Basic .NET». Microsoft. Июль 2004 г. Архивировано с оригинал в 2004-11-15. Получено 4 ноября 2016.
  5. ^ "Квартиры и модели потоков COM". Архивировано из оригинал на 2015-09-23. Получено 2009-06-19.
  6. ^ «Функция CoInitializeEx (COM)». Разработка настольных приложений для Windows. Получено 2013-02-22.
  7. ^ Обзор маршалинга взаимодействия
  8. ^ Качество кода: перспектива открытого исходного кода.
  9. ^ Что это за файл - DOCX? https://docs.fileformat.com/word-processing/docx/ Доступ 13 октября 2020 г.
  10. ^ «Связывание схем XML - Учебное пособие по Java EE 5». docs.oracle.com. Получено 2016-09-14.
  11. ^ «Использование класса XmlSerializer». msdn.microsoft.com. Получено 2016-09-23.
  12. ^ а б "Unmarshaller (JAXB 2.2.3)". jaxb.java.net. Получено 2016-09-14.
  13. ^ "JAXBContext (JAXB 2.2.3)". jaxb.java.net. Получено 2016-09-23.
  14. ^ "JAXBElement (JAXB 2.2.3)". jaxb.java.net. Получено 2016-09-23.