Маршаллинг (информатика)
В информатике хранения маршалинг или маршалинг ( правописание в США ) — это процесс преобразования в представления объекта в памяти формат данных, подходящий для или передачи , особенно между различными средами выполнения . [ нужна ссылка ] Обычно он используется, когда данные необходимо переместить между разными частями компьютерной программы или из одной программы в другую.
Маршалинг упрощает сложные коммуникации, поскольку позволяет использовать составные объекты вместо того, чтобы ограничиваться примитивными объектами .
Сравнение с сериализацией
[ редактировать ]Маршалинг похож на сериализацию или является ее синонимом , хотя технически сериализация — это один шаг в процессе маршалинга объекта.
- Маршалинг описывает общее намерение или процесс передачи некоторого живого объекта от клиента к серверу (при этом клиент и сервер рассматриваются как абстрактные, зеркальные концепции, сопоставляемые с любыми совпадающими концами произвольного канала связи, т. е. сокетами ). Смысл маршалинга объекта заключается в том, чтобы этот объект, присутствующий в одной работающей программе, присутствовал в другой работающей программе; то есть объект на клиенте должен быть передан на сервер, что является формой материализации, позволяющей структуре, данным и состоянию объекта переходить из среды выполнения в другую, используя промежуточное, сериализованное, «сухое» представление (которое второй важности), циркулирующие в коммуникационном сокете.
- Сериализация не обязательно преследует ту же цель, поскольку она занимается только преобразованием данных для создания этого промежуточного, «сухого» представления объекта (например, в поток байтов), которое затем может быть либо воплощено в другой среде выполнения, или просто хранится в базе данных, файле или в памяти.
Таким образом, маршалинг и сериализация могут выполняться по-разному, хотя для маршалинга обычно используется некоторая форма сериализации. [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 (кросс-платформенное подключение).
Пример
[ редактировать ]В семействе операционных систем 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
{
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;
}
}
- XML-представление конкретного Student объекта :
<!-- Code Snippet 1 -->
<?xml version="1.0" encoding="UTF-8"?>
<student id="11235813">
<name>Jayaraman</name>
</student>
<student id="21345589">
<name>Shyam</name>
</student>
- Исполняемое представление этого объекта Student :
// Code Snippet 2
Student s1 = new Student();
s1.setID(11235813);
s1.setName("Jayaraman");
Student s2 = new Student();
s2.setID(21345589);
s2.setName("Shyam");
Демаршалинг — это процесс преобразования XML-представления фрагмента кода 1 в исполняемое Java-представление фрагмента кода 2 по умолчанию и запуск этого самого кода для получения обратно согласованного живого объекта. Если бы был выбран другой формат, процесс демаршаллинга был бы другим, но конечный результат в целевой среде выполнения был бы таким же.
Демаршалинг в Java
[ редактировать ]Демаршаллер в JAXB
[ редактировать ]Процесс демаршаллинга данных XML в исполняемый объект Java осуществляется встроенным классом Unmarshaller. Методы демаршалинга, определенные в классе Unmarshaller, перегружены для приема XML из различных типов входных данных, таких как файл, FileInputStream или URL-адрес. [13] Например:
JAXBContext jcon = JAXBContext.newInstance("com.acme.foo");
Unmarshaller umar = jcon.createUnmarshaller();
Object obj = umar.unmarshal(new File("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]
Свойство JAXBElement | Ценить |
---|---|
имя | имя элемента xml |
ценить | экземпляр объявленного типа |
объявленный тип | демаршалирования метода объявленного типа параметр |
объем | ноль (фактический размер неизвестен) |
См. также
[ редактировать ]- Бесплатный драйвер графического устройства с открытым исходным кодом # Архитектура программного обеспечения
- Объектная модель компонента
- КОРБА
- Пикль (Питон)
- Буферы протоколов
- Архитектура Java для привязки XML
- Соглашение о вызовах
Ссылки
[ редактировать ]- ^ Джеффри Хантин. «В чем разница между сериализацией и маршалингом?» . Сеть обмена стеками . Проверено 23 июля 2021 г.
- ^ «marshal — Внутренняя сериализация объектов Python» . Фонд программного обеспечения Python . Проверено 4 ноября 2016 г.
- ^ «marshal — Внутренняя сериализация объектов Python» . Фонд программного обеспечения Python . Проверено 9 октября 2019 г.
- ^ «Схема представления объектов Java(tm) в каталоге LDAP» . IETF. Октябрь 1999 года . Проверено 4 ноября 2016 г.
- ^ «Как маршалировать объект на удаленный сервер по значению с помощью Visual Basic .NET» . Майкрософт. Июль 2004 г. Архивировано из оригинала 15 ноября 2004 г. Проверено 4 ноября 2016 г.
- ^ «Апартаменты и модели потоков COM» . Архивировано из оригинала 23 сентября 2015 г. Проверено 19 июня 2009 г.
- ^ «Функция CoInitializeEx (COM)» . Разработка настольных приложений для Windows . Проверено 22 февраля 2013 г.
- ^ Обзор маршалинга взаимодействия
- ^ Качество кода: взгляд на открытый исходный код .
- ^ Что такое файл DOCX? https://docs.fileformat.com/word-processing/docx/ По состоянию на 13 октября 2020 г.
- ^ «Привязка XML-схем — Учебное пособие по Java EE 5» . docs.oracle.com . Проверено 14 сентября 2016 г.
- ^ «Использование класса XmlSerializer» . msdn.microsoft.com . Проверено 23 сентября 2016 г.
- ^ Jump up to: а б «Демаршаллер (JAXB 2.2.3)» . jaxb.java.net . Проверено 14 сентября 2016 г.
- ^ «JAXBContext (JAXB 2.2.3)» . jaxb.java.net . Проверено 23 сентября 2016 г.
- ^ «JAXBElement (JAXB 2.2.3)» . jaxb.java.net . Проверено 23 сентября 2016 г.