Из Википедии, бесплатной энциклопедии
  (Перенаправлен из демаршаллинга )
Перейти к навигации Перейти к поиску

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

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

Точное определение маршалинга различается в разных языках программирования, таких как Python , Java и .NET , и в некоторых контекстах используется как синоним сериализации.

Сравнение с сериализацией [ править ]

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

Термин «маршал» используется для определенного типа «сериализации» в стандартной библиотеке 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).

Пример [ править ]

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

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

Драйверы Linux OpenGL разделены на две части: драйвер ядра и драйвер пользовательского пространства. Драйвер пользовательского пространства выполняет всю трансляцию команд OpenGL в машинный код, который будет отправлен на графический процессор . Чтобы уменьшить количество системных вызовов, драйвер пользовательского пространства реализует маршалинг. Если командный буфер графического процессора заполнен данными рендеринга, 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 или архитектура Java для привязки XML - это наиболее распространенная структура, используемая разработчиками для маршалинга и демаршалирования объектов Java. JAXB обеспечивает взаимное преобразование между основными типами данных, поддерживаемыми Java, и стандартными типами данных схемы XML . [10]

XmlSerializer [ править ]

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

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

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

открытый  класс  Student {  частное  имя символа  [ 50 ] ; частный int ID ; public String getName () { вернуть это . имя ; } public int getID () { вернуть это . ID ; } void setName ( имя строки ) { this . name = name ; } недействителен                           setID ( int  ID )  {  это . ID  =  ID ;  } }
  • XML-представление объекта Student :
<! - Фрагмент кода: 1 -><? xml version = «1.0» encoding = «UTF-8»?>  <student  id =  «11235813» >  <name> Jayaraman </name>  </student>  <student  id =  «21345589» >  <name> Shyam < / имя>  </student>
  • Исполняемое представление объекта Student :
// Фрагмент кода: 2Студент  s1  =  новый  Студент (); s1 . setID ( 11235813 ); s1 . setName ( "Джаяраман" ); Студент  s2  =  новый  Студент (); s2 . setID ( 21345589 ); s2 . setName ( "Шьям" );

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

Немаршалинг XML-данных [ править ]

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

Демаршалировать глобальный корневой элемент XML [ править ]

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

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

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

См. Также [ править ]

  • Бесплатный драйвер графического устройства с открытым исходным кодом # Архитектура программного обеспечения
  • Компонентная объектная модель
  • CORBA
  • Рассол (Python)
  • Буферы протокола
  • Архитектура Java для привязки XML

Ссылки [ править ]

  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 . Проверено 19 июня 2009 .
  6. ^ "Функция CoInitializeEx (COM)" . Разработка настольных приложений для Windows . Проверено 22 февраля 2013 .
  7. ^ Обзор маршалинга взаимодействия
  8. ^ Качество кода: перспектива открытого исходного кода .
  9. ^ Что такое файл DOCX? https://docs.fileformat.com/word-processing/docx/ По состоянию на 13 октября 2020 г.
  10. ^ «Привязка схем XML - Учебное пособие по Java EE 5» . docs.oracle.com . Проверено 14 сентября 2016 .
  11. ^ «Использование класса XmlSerializer» . msdn.microsoft.com . Проверено 23 сентября 2016 .
  12. ^ a b "Unmarshaller (JAXB 2.2.3)" . jaxb.java.net . Проверено 14 сентября 2016 .
  13. ^ "JAXBContext (JAXB 2.2.3)" . jaxb.java.net . Проверено 23 сентября 2016 .
  14. ^ "JAXBElement (JAXB 2.2.3)" . jaxb.java.net . Проверено 23 сентября 2016 .