stringtranslate.com

Маршаллинг (информатика)

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

Маршалинг упрощает сложные коммуникации, поскольку позволяет использовать составные объекты вместо того, чтобы ограничиваться примитивными объектами .

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

Маршалинг может быть чем-то похож на сериализацию или синонимом ей , хотя технически сериализация — это всего лишь шаг в маршалинге объекта.

Таким образом, маршалинг и сериализация могут выполняться по-разному, хотя для маршалинга обычно используется некоторая форма сериализации. [1]

Термин десериализация чем-то похож на демаршалинг сухого объекта «на стороне сервера», т.е. демаршалинг (или демаршалинг) для возврата живого объекта: сериализованный объект преобразуется во внутреннюю структуру данных, т.е. живой объект в целевой среде выполнения. Обычно это соответствует точно обратному процессу маршаллинга, хотя иногда оба конца процесса запускают определенную бизнес-логику.

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

Маршалинг на разных языках программирования

« Сериализация » объекта означает преобразование его состояния в поток байтов таким образом, чтобы поток байтов можно было преобразовать обратно в копию объекта, что по сути является демаршалингом. Различные языки программирования либо проводят, либо не проводят различие между этими двумя понятиями. Несколько примеров:

В Python термин «маршал» используется для определенного типа «сериализации» в стандартной библиотеке Python [2] — хранения внутренних объектов Python:

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

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

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

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

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

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

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

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

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

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

Использование и примеры

Маршалинг используется в реализациях различных механизмов удаленного вызова процедур (RPC), где необходимо транспортировать данные между процессами и/или между потоками .

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

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

Пример

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

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

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

Форматы

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

XML против JSON против…

XML — один из таких форматов и средств передачи данных между системами. Microsoft, например, использует его в качестве основы форматов файлов различных компонентов (Word, Excel, Access, PowerPoint и т. д.) пакета Microsoft Office (см. Office Open XML ).

Хотя это обычно приводит к подробному формату проводной передачи, синтаксис XML с полностью заключенными в скобки «начальным тегом» и «конечным тегом» позволяет обеспечить более точную диагностику и упростить восстановление после ошибок передачи или диска. Кроме того, поскольку теги встречаются неоднократно, для сжатия содержимого можно использовать стандартные методы сжатия — все форматы файлов Office создаются путем архивирования необработанного XML. [10] Альтернативные форматы, такие как JSON (нотация объектов JavaScript), более кратки, но, соответственно, менее надежны для восстановления после ошибок.

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

ЯКСБ

JAXB или архитектура Java для привязки XML — это наиболее распространенная среда, используемая разработчиками для маршалинга и демаршалинга объектов Java. JAXB обеспечивает взаимное преобразование между фундаментальными типами данных, поддерживаемыми Java, и стандартными типами данных схемы XML . [11]

XmlSerializer

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

От XML к исполняемому представлению

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

public class Student { имя частного персонажа [ 150 ] ; частный внутренний идентификатор ; общественная строка getName () { верните это . имя ; } Public int getID () { верните это . ИДЕНТИФИКАТОР ; } void setName ( строковое имя ) { this . имя = имя ; } void setID ( int ID ) { this . идентификатор = идентификатор ; } }                                      
<!-- Фрагмент кода 1 --><?xml version="1.0"coding="UTF-8"?> <student id= "11235813" > <name> Джаяраман </name> </student> <student id= "21345589" > <name> Шьям < /имя> </студент>        
// Фрагмент кода 2Студент s1 = новый Студент (); с1 . setID ( 11235813 ); с1 . setName ( "Джаяраман" ); Студент s2 = новый Студент (); с2 . setID ( 21345589 ); с2 . setName ( "Шьям" );        

Демаршалинг — это процесс преобразования XML-представления фрагмента кода 1 в исполняемое Java-представление фрагмента кода 2 по умолчанию и запуск этого самого кода для получения обратно согласованного живого объекта. Если бы был выбран другой формат, процесс демаршаллинга был бы другим, но конечный результат в целевой среде выполнения был бы таким же.

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

Демаршаллер в JAXB

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

JAXBContext jcon = JAXBContext . newInstance ( "com.acme.foo" ); Unmarshaller umar = jcon . createUnmarshaller (); Объект obj = umar . демаршал ( новый файл ( "input.xml" ));          

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

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

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

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

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

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

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

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

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