stringtranslate.com

Маршаллинг (компьютерные науки)

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

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

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

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

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

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

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

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

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

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

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

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

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

В связанном с Java RFC  2713 маршалинг используется при сериализации объектов для удаленного вызова . Маршалинговый объект записывает состояние исходного объекта и содержит кодовую базу ( здесь кодовая база относится к списку 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 (Cross-Platform Connect).

Пример

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

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

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

Форматы

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

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

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

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

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

JAXB

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

XmlSerializer

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

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

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

public class Student { private char name [ 150 ] ; private int ID ; public String getName ( ) { return this.name ; } public int getID ( ) { return this.ID ; } void setName ( String name ) { this.name = name ; } void setID ( int ID ) { this.ID = ID ; } }                                      
<!-- Фрагмент кода 1 --><?xml version="1.0" encoding="UTF-8"?> <student id= "11235813" > <name> Джаяраман </name> </student> <student id= "21345589" > <name> Шьям </name> </student>        
// Фрагмент кода 2Студент s1 = новый Студент ( ); s1.setID ( 11235813 ) ; s1.setName ( " Джаяраман" ) ; Студент s2 = новый Студент ( ) ; s2.setID ( 21345589 ); s2.setName ( " Шьям " ) ;        

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

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

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

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

JAXBContext jcon = JAXBContext.newInstance ( "com.acme.foo" ) ; Демаршаллер umar = jcon.createUnmarshaller ( ) ; Объект obj = umar.unmarshal ( new File ( " input.xml" ) ) ;          

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

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

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

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

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

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

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

Ссылки

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