stringtranslate.com

Marshalling (informática)

En informática , marshalling o marshaling ( ortografía estadounidense ) es el proceso de transformar la representación en memoria de un objeto en un formato de datos adecuado para el almacenamiento o la transmisión , especialmente entre diferentes tiempos de ejecución . [ cita necesaria ] Por lo general, se usa cuando los datos deben moverse entre diferentes partes de un programa de computadora o de un programa a otro.

Marshalling simplifica las comunicaciones complejas porque permite utilizar objetos compuestos en lugar de restringirse a objetos primitivos .

Comparación con la serialización

La clasificación puede ser algo similar o sinónimo de serialización , aunque técnicamente la serialización es un paso en el proceso de clasificación de un objeto.

Por tanto, la clasificación y la serialización se pueden realizar de forma diferente, aunque normalmente se utiliza alguna forma de serialización para realizar la clasificación. [1]

El término deserialización es algo similar a desarmar un objeto seco "en el lado del servidor", es decir. ordenar (o desarmar) para recuperar un objeto vivo: el objeto serializado se transforma en una estructura de datos interna, es decir. un objeto vivo dentro del tiempo de ejecución de destino. Por lo general, corresponde exactamente al proceso inverso de marshalling, aunque a veces ambos extremos del proceso desencadenan una lógica empresarial específica.

La definición precisa de marshalling difiere entre lenguajes de programación como Python , Java y .NET y, en algunos contextos, se usa indistintamente con serialización.

Marshalling en diferentes lenguajes de programación.

" Serializar " un objeto significa convertir su estado en un flujo de bytes de tal manera que el flujo de bytes pueda volver a convertirse en una copia del objeto, lo que en esencia es descomponer. Los diferentes lenguajes de programación distinguen o no entre los dos conceptos. Algunos ejemplos:

En Python , el término "mariscal" se utiliza para un tipo específico de "serialización" en la biblioteca estándar de Python [2] : almacenar objetos internos de Python:

El módulo marshal existe principalmente para admitir la lectura y escritura de código "pseudocompilado" para módulos Python de archivos .pyc.

Si está serializando y deserializando objetos Python, use el módulo pickle en su lugar

—  La biblioteca estándar de Python [3]

En el RFC 2713 relacionado con Java  , la clasificación se utiliza al serializar objetos para invocación remota . Un objeto que se ordena registra el estado del objeto original y contiene el código base ( el código base aquí se refiere a una lista de URL desde donde se puede cargar el código objeto, y no el código fuente). Por lo tanto, para convertir el estado del objeto y las bases de código, se debe realizar una desclasificación. La interfaz Unmarshaller convierte automáticamente los datos ordenados que contienen bases de código en un objeto Java ejecutable en JAXB. Cualquier objeto que pueda deserializarse puede deserializarse. Sin embargo, lo contrario no tiene por qué ser cierto.

"Organizar" un objeto significa registrar su estado y su(s) código(s) base(s) de tal manera que cuando el objeto ordenado se "desordene", se obtenga una copia del objeto original, posiblemente cargando automáticamente las definiciones de clase del objeto. Puede reunir cualquier objeto que sea serializable o remoto (es decir, que implemente la interfaz java.rmi.Remote). La clasificación es como la serialización, excepto que la clasificación también registra bases de código. La clasificación se diferencia de la serialización en que la clasificación trata especialmente los objetos remotos.

Cualquier objeto cuyos métodos puedan invocarse [en un objeto en otra máquina virtual Java] debe implementar la interfaz java.rmi.Remote. Cuando se invoca un objeto de este tipo, sus argumentos se ordenan y se envían desde la máquina virtual local a la remota, donde los argumentos se desordenan y se utilizan.

—  Esquema para representar objetos Java(tm) en un directorio LDAP (RFC 2713) [4]

En .NET , la clasificación también se utiliza para referirse a la serialización cuando se utilizan llamadas remotas :

Cuando ordena un objeto por valor, se crea una copia del objeto y se serializa en el servidor. Cualquier llamada a método realizada en ese objeto se realiza en el servidor.

—  Cómo clasificar un objeto en un servidor remoto por valor mediante Visual Basic .NET (Q301116) [5]

Uso y ejemplos

Marshalling se utiliza dentro de implementaciones de diferentes mecanismos de llamada a procedimiento remoto (RPC), donde es necesario transportar datos entre procesos y/o entre subprocesos .

En el Modelo de objetos componentes (COM) de Microsoft , los punteros de interfaz deben ordenarse al cruzar los límites de los apartamentos COM. [6] [7] En .NET Framework , la conversión entre un tipo no administrado y un tipo CLR , como en el proceso P/Invoke , también es un ejemplo de una acción que requiere que se lleve a cabo una clasificación. [8]

Además, la clasificación se utiliza ampliamente en scripts y aplicaciones que utilizan las tecnologías XPCOM proporcionadas dentro del marco de aplicaciones de Mozilla . El navegador Mozilla Firefox es una aplicación popular creada con este marco, que además permite que los lenguajes de scripting utilicen XPCOM a través de XPConnect (Cross-Platform Connect).

Ejemplo

En la familia de sistemas operativos Microsoft Windows, todo el conjunto de controladores de dispositivos para Direct3D son controladores en modo kernel. La parte del modo de usuario de la API es manejada por el tiempo de ejecución DirectX proporcionado por Microsoft.

Esto es un problema porque llamar a operaciones en modo kernel desde el modo usuario requiere realizar una llamada al sistema , y ​​esto inevitablemente obliga a la CPU a cambiar al "modo kernel". Esta es una operación lenta que tarda del orden de microsegundos en completarse. [9] Durante este tiempo, la CPU no puede realizar ninguna operación. Como tal, minimizar el número de veces que se debe realizar esta operación de conmutación optimizaría el rendimiento en un grado sustancial.

Los controladores OpenGL de Linux se dividen en dos: un controlador de kernel y un controlador de espacio de usuario. El controlador de espacio de usuario realiza toda la traducción de los comandos OpenGL al código de máquina para enviarlos a la GPU . Para reducir la cantidad de llamadas al sistema, el controlador de espacio de usuario implementa la clasificación. Si el búfer de comandos de la GPU está lleno de datos de renderizado, la API podría simplemente almacenar la llamada de renderizado solicitada en un búfer temporal y, cuando el búfer de comandos esté a punto de estar vacío, puede realizar un cambio al modo kernel y agregar una cantidad de comandos almacenados todos a la vez.

Formatos

La clasificación de datos requiere algún tipo de transferencia de datos, que aprovecha un formato de datos específico que se elige como destino de serialización.

XML frente a JSON frente a...

XML es uno de esos formatos y medios para transferir datos entre sistemas. Microsoft, por ejemplo, lo utiliza como base de los formatos de archivo de los distintos componentes (Word, Excel, Access, PowerPoint, etc.) de la suite Microsoft Office (ver Office Open XML ).

Si bien esto generalmente resulta en un formato de cable detallado, la sintaxis de "etiqueta de inicio" y "etiqueta de fin" de XML, completamente entre corchetes, permite proporcionar diagnósticos más precisos y una recuperación más fácil de errores de transmisión o de disco. Además, debido a que las etiquetas aparecen repetidamente, se pueden usar métodos de compresión estándar para reducir el contenido: todos los formatos de archivos de Office se crean comprimiendo el XML sin formato. [10] Los formatos alternativos como JSON (JavaScript Object Notation) son más concisos, pero en consecuencia menos robustos para la recuperación de errores.

Una vez que los datos se transfieren a un programa o aplicación, es necesario volver a convertirlos en un objeto para su uso. Por lo tanto, la desclasificación se utiliza generalmente en el extremo receptor de las implementaciones de los mecanismos de invocación de método remoto (RMI) y llamada a procedimiento remoto (RPC) para desclasificar los objetos transmitidos en un formato ejecutable.

JAXB

JAXB o Java Architecture for XML Binding es el marco más común utilizado por los desarrolladores para ordenar y desarmar objetos Java. JAXB proporciona la interconversión entre tipos de datos fundamentales soportados por Java y tipos de datos de esquema XML estándar . [11]

XmlSerializador

XmlSerializer es el marco utilizado por los desarrolladores de C# para ordenar y desorganizar objetos de C#. Una de las ventajas de C# sobre Java es que C# admite de forma nativa la clasificación debido a la inclusión de la clase XmlSerializer. Java, por otro lado, requiere un código adhesivo no nativo en forma de JAXB para admitir la clasificación. [12]

De XML a una representación ejecutable

Un ejemplo de descomposición es la conversión de una representación XML de un objeto a la representación predeterminada del objeto en cualquier lenguaje de programación. Considere la siguiente clase:

clase pública Estudiante { nombre de carácter privado [ 150 ] ; identificación interna privada ; cadena pública getName () { devuelve esto . nombre ; } public int getID () { devolver esto . IDENTIFICACIÓN ; } void setName ( nombre de cadena ) { this . nombre = nombre ; } void setID ( int ID ) { este . DNI = DNI ; } }                                      
<!-- Fragmento de código 1 --><?xml versión="1.0" codificación="UTF-8"?> < id de estudiante= "11235813" > <nombre> Jayaraman </nombre> </estudiante> < id de estudiante= "21345589" > <nombre> Shyam < /nombre> </estudiante>        
// Fragmento de código 2Estudiante s1 = nuevo Estudiante (); s1 . establecerID ( 11235813 ); s1 . establecerNombre ( "Jayaraman" ); Estudiante s2 = nuevo Estudiante (); s2 . establecerID ( 21345589 ); s2 . establecerNombre ( "Shyam" );        

Desarmar es el proceso de convertir la representación XML del fragmento de código 1 a la representación Java ejecutable predeterminada del fragmento de código 2 y ejecutar ese mismo código para recuperar un objeto vivo y coherente. Si se hubiera elegido un formato diferente, el proceso de organización habría sido diferente, pero el resultado final en el tiempo de ejecución objetivo sería el mismo.

Desmontaje en Java

Unmarshaller en JAXB

La clase Unmarshaller incorporada se encarga del proceso de descomponer datos XML en un objeto Java ejecutable. Los métodos de desmarshal definidos en la clase Unmarshaller están sobrecargados para aceptar XML de diferentes tipos de entrada, como un archivo, FileInputStream o URL. [13] Por ejemplo:

JAXBContext jcon = JAXBContext . nuevaInstancia ( "com.acme.foo" ); Unmarshaller umar = jcon . crearUnmarshaller (); Objeto obj = umar . desarmar ( nuevo archivo ( "input.xml" ));          

Desmontaje de datos XML

Los métodos de Unmarshal pueden deserializar un documento XML completo o una pequeña parte de él. Cuando el elemento raíz XML se declara globalmente, estos métodos utilizan la asignación de elementos raíz XML de JAXBContext a clases asignadas JAXB para iniciar la descomposición. Si las asignaciones no son suficientes y los elementos raíz se declaran localmente, los métodos de desclasificación utilizan métodos declaradosType para el proceso de desclasificación. Estos dos enfoques se pueden entender a continuación. [13]

Desarmar un elemento raíz XML global

El método de desclasificación utiliza JAXBContext para desclasificar los datos XML, cuando el elemento raíz se declara globalmente. El objeto JAXBContext siempre mantiene una asignación del elemento XML declarado globalmente y su nombre a una clase asignada JAXB. Si el nombre del elemento XML o su @xsi:typeatributo coincide con la clase asignada JAXB, el método de desclasificación transforma los datos XML utilizando la clase asignada JAXB adecuada. Sin embargo, si el nombre del elemento XML no coincide, el proceso de desclasificación se cancelará y generará una UnmarshalException . Esto se puede evitar utilizando los métodos unmarshal by declareType. [14]

Desarmar un elemento raíz XML local

Cuando el elemento raíz no se declara globalmente, la aplicación ayuda al desmarshaller mediante el mapeo proporcionado por la aplicación utilizando parámetros de tipo declarado. Por orden de precedencia, incluso si el nombre raíz tiene una asignación a una clase JAXB apropiada, el tipo declarado anula la asignación. Sin embargo, si el @xsi:typeatributo de los datos XML tiene una asignación a una clase JAXB adecuada, esto tiene prioridad sobre el parámetro tipo declarado. Los métodos de desclasificación mediante parámetros de tipo declarado siempre devuelven una JAXBElement<declaredType>instancia. Las propiedades de esta instancia JAXBElement se establecen de la siguiente manera: [15]

Ver también

Referencias

  1. ^ Jeffrey Hantin. "¿Cuál es la diferencia entre serialización y clasificación?". Red de intercambio de pila . Consultado el 23 de julio de 2021 .
  2. ^ "marshal - Serialización interna de objetos Python". Fundación de software Python . Consultado el 4 de noviembre de 2016 .
  3. ^ "marshal - Serialización interna de objetos Python". Fundación de software Python . Consultado el 9 de octubre de 2019 .
  4. ^ "Esquema para representar objetos Java (tm) en un directorio LDAP". IETF. Octubre de 1999 . Consultado el 4 de noviembre de 2016 .
  5. ^ "Cómo clasificar un objeto en un servidor remoto por valor mediante Visual Basic .NET". Microsoft. Julio de 2004. Archivado desde el original el 15 de noviembre de 2004 . Consultado el 4 de noviembre de 2016 .
  6. ^ "Apartamentos y modelos de subprocesos COM". Archivado desde el original el 23 de septiembre de 2015 . Consultado el 19 de junio de 2009 .
  7. ^ "Función CoInitializeEx (COM)". Desarrollo de aplicaciones de escritorio para Windows . Consultado el 22 de febrero de 2013 .
  8. ^ Descripción general de la clasificación de interoperabilidad
  9. ^ Calidad del código: la perspectiva del código abierto.
  10. ^ ¿Qué es un archivo DOCX? https://docs.fileformat.com/word-processing/docx/ Consultado el 13 de octubre de 2020.
  11. ^ "Enlace de esquemas XML: tutorial de Java EE 5". docs.oracle.com . Consultado el 14 de septiembre de 2016 .
  12. ^ "Uso de la clase XmlSerializer". msdn.microsoft.com . Consultado el 23 de septiembre de 2016 .
  13. ^ ab "Unmarshaller (JAXB 2.2.3)". jaxb.java.net . Consultado el 14 de septiembre de 2016 .
  14. ^ "JAXBContext (JAXB 2.2.3)". jaxb.java.net . Consultado el 23 de septiembre de 2016 .
  15. ^ "JAXBElemento (JAXB 2.2.3)". jaxb.java.net . Consultado el 23 de septiembre de 2016 .