En informática, la serialización (o serialización ) es el proceso de traducir una estructura de datos o un estado de objeto a un formato que se pueda almacenar (por ejemplo, archivos en dispositivos de almacenamiento secundario , buffers de datos en dispositivos de almacenamiento primario) o transmitir (por ejemplo, flujos de datos a través de redes informáticas ) y reconstruir más tarde (posiblemente en un entorno informático diferente). [1] Cuando la serie de bits resultante se vuelve a leer de acuerdo con el formato de serialización, se puede utilizar para crear un clon semánticamente idéntico del objeto original. Para muchos objetos complejos, como los que hacen un uso extensivo de referencias , este proceso no es sencillo. La serialización de objetos no incluye ninguno de sus métodos asociados con los que estaban vinculados previamente.
Este proceso de serialización de un objeto también se denomina serialización de un objeto en algunas situaciones. [2] [3] [4] La operación opuesta, extraer una estructura de datos de una serie de bytes, es la deserialización (también llamada anulación de serialización o anulación de serialización ).
En el hardware de los equipos de red, la parte que se encarga de la serialización y deserialización se denomina comúnmente SerDes .
Los usos de la serialización incluyen:
Para que algunas de estas características sean útiles, se debe mantener la independencia de la arquitectura. Por ejemplo, para un uso máximo de la distribución, una computadora que se ejecuta en una arquitectura de hardware diferente debe poder reconstruir de manera confiable un flujo de datos serializado, independientemente del orden de bytes . Esto significa que el procedimiento más simple y rápido de copiar directamente el diseño de memoria de la estructura de datos no puede funcionar de manera confiable para todas las arquitecturas. Serializar la estructura de datos en un formato independiente de la arquitectura significa evitar los problemas de ordenamiento de bytes , diseño de memoria o simplemente diferentes formas de representar estructuras de datos en diferentes lenguajes de programación .
Un elemento inherente a cualquier esquema de serialización es que, debido a que la codificación de los datos es por definición serial, extraer una parte de la estructura de datos serializada requiere que se lea todo el objeto de principio a fin y se reconstruya. En muchas aplicaciones, esta linealidad es una ventaja, ya que permite utilizar interfaces de E/S simples y comunes para almacenar y transmitir el estado de un objeto. En aplicaciones donde un mayor rendimiento es un problema, puede tener sentido dedicar más esfuerzo a lidiar con una organización de almacenamiento más compleja y no lineal.
Incluso en una sola máquina, los objetos punteros primitivos son demasiado frágiles para salvarlos porque los objetos a los que apuntan pueden volver a cargarse en una ubicación diferente en la memoria. Para lidiar con esto, el proceso de serialización incluye un paso llamado unswizzling o pointer unswizzling , donde las referencias directas de puntero se convierten en referencias basadas en el nombre o la posición. El proceso de deserialización incluye un paso inverso llamado pointer swizzling .
Dado que tanto la serialización como la deserialización pueden controlarse desde un código común (por ejemplo, la función Serialize en Microsoft Foundation Classes ), es posible que el código común haga ambas cosas al mismo tiempo y, por lo tanto, 1) detecte diferencias entre los objetos que se serializan y sus copias anteriores, y 2) proporcione la entrada para la siguiente detección de este tipo. No es necesario crear realmente la copia anterior porque las diferencias se pueden detectar sobre la marcha, una técnica llamada ejecución diferencial. Esto es útil en la programación de interfaces de usuario cuyos contenidos varían en el tiempo: se pueden crear, eliminar, alterar o hacer que los objetos gráficos gestionen eventos de entrada sin tener que escribir necesariamente un código separado para hacer esas cosas.
La serialización rompe la opacidad de un tipo de datos abstracto al exponer potencialmente detalles de implementación privados. Las implementaciones triviales que serializan todos los miembros de datos pueden violar la encapsulación . [5]
Para disuadir a los competidores de fabricar productos compatibles, los editores de software propietario suelen mantener en secreto comercial los detalles de los formatos de serialización de sus programas . Algunos ofuscan deliberadamente o incluso cifran los datos serializados. Sin embargo, la interoperabilidad requiere que las aplicaciones puedan comprender los formatos de serialización de las demás. Por lo tanto, las arquitecturas de llamadas a métodos remotos como CORBA definen sus formatos de serialización en detalle.
Muchas instituciones, como archivos y bibliotecas, intentan proteger sus archivos de respaldo (en particular, los volcados de bases de datos ) para el futuro almacenándolos en algún formato serializado relativamente legible para humanos .
La tecnología Xerox Network Systems Courier de principios de los años 1980 influyó en el primer estándar ampliamente adoptado. Sun Microsystems publicó la Representación de datos externos (XDR) en 1987. [6] XDR es un formato abierto y está estandarizado como STD 67 (RFC 4506).
A finales de los años 1990, se inició un impulso para proporcionar una alternativa a los protocolos de serialización estándar: XML , un subconjunto de SGML , se utilizó para producir una codificación basada en texto legible por humanos . Este tipo de codificación puede ser útil para objetos persistentes que pueden ser leídos y comprendidos por humanos, o comunicados a otros sistemas independientemente del lenguaje de programación. Tiene la desventaja de perder la codificación más compacta basada en flujo de bytes, pero en este punto las mayores capacidades de almacenamiento y transmisión hicieron que el tamaño de archivo fuera una preocupación menor que en los primeros días de la informática. En la década de 2000, XML se utilizó a menudo para la transferencia asincrónica de datos estructurados entre el cliente y el servidor en aplicaciones web Ajax . XML es un formato abierto y estandarizado como recomendación del W3C.
JSON es una alternativa ligera de texto sin formato a XML y también se utiliza habitualmente para la comunicación entre cliente y servidor en aplicaciones web. JSON se basa en la sintaxis de JavaScript , pero es independiente de JavaScript y es compatible con muchos otros lenguajes de programación. JSON es un formato abierto, estandarizado como STD 90 ( RFC 8259), ECMA-404 e ISO/IEC 21778:2017.
YAML es un superconjunto estricto de JSON e incluye características adicionales como etiquetas de tipos de datos, compatibilidad con estructuras de datos cíclicas, sintaxis sensible a la sangría y múltiples formas de citar datos escalares. YAML es un formato abierto.
Las listas de propiedades se utilizan para la serialización en los frameworks NeXTSTEP , GNUstep , macOS e iOS . La lista de propiedades , o p-list para abreviar, no se refiere a un único formato de serialización, sino a varias variantes diferentes, algunas legibles por humanos y una binaria.
Para conjuntos de datos científicos de gran volumen, como datos satelitales y resultados de modelos numéricos de clima, tiempo u océano, se han desarrollado estándares de serialización binaria específicos, por ejemplo, HDF , netCDF y el antiguo GRIB .
Varios lenguajes de programación orientados a objetos admiten directamente la serialización de objetos (o el archivado de objetos ), ya sea mediante elementos sintácticos o proporcionando una interfaz estándar para hacerlo. Los lenguajes que lo hacen incluyen Ruby , Smalltalk , Python , PHP , Objective-C , Delphi , Java y la familia de lenguajes .NET . También hay bibliotecas disponibles que agregan soporte de serialización a lenguajes que carecen de soporte nativo para ello.
C y C++ no proporcionan serialización como ningún tipo de construcción de alto nivel, pero ambos lenguajes admiten la escritura de cualquiera de los tipos de datos integrados , así como de las antiguas estructuras de datos , como datos binarios. Como tal, suele ser trivial escribir funciones de serialización personalizadas. Además, las soluciones basadas en compiladores, como el sistema ODB ORM para C++ y el kit de herramientas gSOAP para C y C++, son capaces de producir automáticamente código de serialización con pocas o ninguna modificación en las declaraciones de clase. Otros marcos de serialización populares son Boost.Serialization [7] del Boost Framework , el marco S11n, [8] y Cereal. [9] El marco MFC (Microsoft) también proporciona una metodología de serialización como parte de su arquitectura Document-View.
CFML permite serializar estructuras de datos a WDDX con la <cfwddx>
etiqueta y a JSON con la función SerializeJSON().
Delphi ofrece un mecanismo integrado para la serialización de componentes (también llamados objetos persistentes), que está totalmente integrado con su IDE . El contenido del componente se guarda en un archivo DFM y se vuelve a cargar sobre la marcha.
Go admite de forma nativa la desagrupación y agrupación de datos JSON y XML . [10] También hay módulos de terceros que admiten YAML [11] y Protocol Buffers . [12] Go también admite Gobs . [13]
En Haskell, la serialización es compatible con los tipos que son miembros de las clases de tipos Read y Show . Cada tipo que es miembro de la Read
clase de tipo define una función que extraerá los datos de la representación de cadena de los datos volcados. La Show
clase de tipo, a su vez, contiene la show
función a partir de la cual se puede generar una representación de cadena del objeto. El programador no necesita definir las funciones explícitamente: simplemente declarar que un tipo deriva Read o que deriva Show, o ambos, puede hacer que el compilador genere las funciones apropiadas para muchos casos (pero no todos: los tipos de función, por ejemplo, no pueden derivar automáticamente Show o Read). La instancia generada automáticamente para Show también produce código fuente válido, por lo que se puede generar el mismo valor Haskell ejecutando el código producido por show en, por ejemplo, un intérprete Haskell. [14] Para una serialización más eficiente, existen bibliotecas Haskell que permiten la serialización de alta velocidad en formato binario, por ejemplo, binary.
Java proporciona serialización automática que requiere que el objeto se marque mediante la implementación de la java.io.Serializable
interfaz . La implementación de la interfaz marca la clase como "apta para serializar", y luego Java maneja la serialización internamente. No hay métodos de serialización definidos en la Serializable
interfaz, pero una clase serializable puede definir opcionalmente métodos con ciertos nombres y firmas especiales que, si se definen, se llamarán como parte del proceso de serialización/deserialización. El lenguaje también permite al desarrollador anular el proceso de serialización de manera más completa mediante la implementación de otra interfaz, la Externalizable
interfaz, que incluye dos métodos especiales que se utilizan para guardar y restaurar el estado del objeto.
Hay tres razones principales por las que los objetos no son serializables de forma predeterminada y deben implementar la Serializable
interfaz para acceder al mecanismo de serialización de Java.
En primer lugar, no todos los objetos capturan semántica útil en un estado serializado. Por ejemplo, un Thread
objeto está vinculado al estado de la JVM actual . No existe un contexto en el que un Thread
objeto deserializado mantenga una semántica útil.
En segundo lugar, el estado serializado de un objeto forma parte del contrato de compatibilidad de su clase. Mantener la compatibilidad entre versiones de clases serializables requiere un esfuerzo y una consideración adicionales. Por lo tanto, hacer que una clase sea serializable debe ser una decisión de diseño deliberada y no una condición predeterminada.
Por último, la serialización permite el acceso a miembros privados no transitorios de una clase que de otro modo no serían accesibles. Las clases que contienen información confidencial (por ejemplo, una contraseña) no deben ser serializables ni externalizables. [15] : 339–345 El método de codificación estándar utiliza una traducción recursiva basada en gráficos del descriptor de clase del objeto y los campos serializables en un flujo de bytes. Los primitivos , así como los objetos referenciados no transitorios y no estáticos, se codifican en el flujo. Cada objeto al que hace referencia el objeto serializado a través de un campo que no está marcado como transient
también debe serializarse; y si algún objeto en el gráfico completo de referencias de objetos no transitorios no es serializable, entonces la serialización fallará. El desarrollador puede influir en este comportamiento marcando objetos como transitorios o redefiniendo la serialización de un objeto de modo que alguna parte del gráfico de referencia se trunque y no se serialice.
Java no utiliza un constructor para serializar objetos. Es posible serializar objetos Java a través de JDBC y almacenarlos en una base de datos. [16] Mientras que SwingAunque los componentes implementan la interfaz serializable, no se garantiza que sean portables entre diferentes versiones de la máquina virtual Java. Por lo tanto, un componente Swing, o cualquier componente que lo herede, puede serializarse en un flujo de bytes, pero no se garantiza que se pueda reconstituir en otra máquina.
Desde ECMAScript 5.1, [17] JavaScript ha incluido el objeto incorporado JSON
y sus métodos JSON.parse()
y JSON.stringify()
. Aunque JSON se basa originalmente en un subconjunto de JavaScript, [18] existen casos límite en los que JSON no es JavaScript válido. Específicamente, JSON permite que los terminadores de línea Unicode U+2028 LINE SEPARATOR y U+2029 PARAGRAPH SEPARATOR aparezcan sin escape en cadenas entre comillas, mientras que ECMAScript 2018 y versiones anteriores no lo hacen. [19] [20] Consulte el artículo principal sobre JSON [ broken anchor ] .
Julia implementa la serialización a través de los módulos serialize()
/ deserialize()
, [21] pensados para funcionar dentro de la misma versión de Julia y/o instancia de la misma imagen del sistema. [22] El HDF5.jl
paquete ofrece una alternativa más estable, utilizando un formato documentado y una biblioteca común con contenedores para diferentes lenguajes, [23] mientras que se sugiere que el formato de serialización predeterminado fue diseñado teniendo en mente un rendimiento máximo para la comunicación en red. [24]
Generalmente, una estructura de datos Lisp se puede serializar con las funciones " read
" y " print
". Una variable foo que contenga, por ejemplo, una lista de matrices se imprimiría con (print foo)
. De manera similar, un objeto se puede leer desde un flujo llamado s con (read s)
. Estas dos partes de la implementación de Lisp se denominan Impresora y Lector. La salida de " print
" es legible para humanos; utiliza listas marcadas con paréntesis, por ejemplo: . En muchos tipos de Lisp, incluido Common Lisp , la impresora no puede representar todos los tipos de datos porque no está claro cómo hacerlo. En Common Lisp, por ejemplo, la impresora no puede imprimir objetos CLOS. En su lugar, el programador puede escribir un método en la función genérica , que se invocará cuando se imprima el objeto. Esto es algo similar al método utilizado en Ruby. El código Lisp en sí está escrito en la sintaxis del lector, llamada sintaxis de lectura. La mayoría de los lenguajes utilizan analizadores separados y diferentes para tratar con el código y los datos, Lisp solo utiliza uno. Un archivo que contiene código Lisp puede leerse en la memoria como una estructura de datos, transformarse mediante otro programa y luego posiblemente ejecutarse o escribirse, como en un bucle de lectura-evaluación-impresión . No todos los lectores/escritores admiten estructuras cíclicas, recursivas o compartidas.(4 2.9 "x" y)
print-object
.NET Framework cuenta con varios serializadores diseñados por Microsoft . También existen muchos serializadores de terceros. Aquí se analizan y prueban más de una docena de serializadores. [25] y aquí [26]
La biblioteca estándar de OCamlMarshal
proporciona serialización a través del módulo [3] y las funciones Pervasives output_value
y input_value
. Si bien la programación de OCaml se verifica de forma estática por tipo, los usos del Marshal
módulo pueden romper las garantías de tipo, ya que no hay forma de verificar si un flujo no serializado representa objetos del tipo esperado. En OCaml es difícil serializar una función o una estructura de datos que contiene una función (por ejemplo, un objeto que contiene un método), porque el código ejecutable en funciones no se puede transmitir a través de diferentes programas. (Hay un indicador para serializar la posición del código de una función, pero solo se puede desmarchar exactamente en el mismo programa). Las funciones de serialización estándar pueden preservar el uso compartido y manejar datos cíclicos, que se pueden configurar mediante un indicador.
Varios módulos de Perl disponibles en CPAN proporcionan mecanismos de serialización, incluidos Storable
, JSON::XS
y FreezeThaw
. Storable incluye funciones para serializar y deserializar estructuras de datos de Perl hacia y desde archivos o escalares de Perl. Además de serializar directamente a archivos, Storable
incluye la freeze
función para devolver una copia serializada de los datos empaquetados en un escalar y thaw
para deserializar dicho escalar. Esto es útil para enviar una estructura de datos compleja a través de un socket de red o almacenarla en una base de datos. Al serializar estructuras con Storable
, existen funciones seguras de red que siempre almacenan sus datos en un formato que se puede leer en cualquier computadora con un pequeño costo de velocidad. Estas funciones se denominan nstore
, nfreeze
, etc. No hay funciones "n" para deserializar estas estructuras: las estructuras regulares thaw
y retrieve
deserialize serializadas con las n
funciones " " y sus equivalentes específicos de la máquina.
PHPserialize()
originalmente implementó la serialización a través de las funciones y incorporadas unserialize()
. [27] PHP puede serializar cualquiera de sus tipos de datos excepto recursos (punteros de archivo, sockets, etc.). La función incorporada unserialize()
es a menudo peligrosa cuando se utiliza en datos completamente no confiables. [28] Para los objetos, hay dos " métodos mágicos " que se pueden implementar dentro de una clase — __sleep()
y __wakeup()
— que se llaman desde dentro serialize()
de y unserialize()
, respectivamente, que pueden limpiar y restaurar un objeto. Por ejemplo, puede ser deseable cerrar una conexión de base de datos en la serialización y restaurar la conexión en la deserialización; esta funcionalidad se manejaría en estos dos métodos mágicos. También permiten que el objeto elija qué propiedades se serializan. Desde PHP 5.1, existe un mecanismo de serialización orientado a objetos para objetos, la Serializable
interfaz. [29]
La estructura de términos de Prolog , que es la única estructura de datos del lenguaje, se puede serializar mediante el predicado incorporado write_term/3
y serializar mediante los predicados incorporados read/1
y read_term/2
. El flujo resultante es texto sin comprimir (en alguna codificación determinada por la configuración del flujo de destino), con cualquier variable libre en el término representada por nombres de variable de marcador de posición. El predicado write_term/3
está estandarizado en la Especificación ISO para Prolog (ISO/IEC 13211-1) en las páginas 59 y siguientes ("Escritura de un término, § 7.10.5"). Por lo tanto, se espera que los términos serializados mediante una implementación puedan ser serializados mediante otra sin ambigüedad ni sorpresas. En la práctica, las extensiones específicas de la implementación (por ejemplo, los diccionarios de SWI-Prolog) pueden usar estructuras de términos no estándar, por lo que la interoperabilidad puede romperse en casos extremos. Como ejemplos, consulte las páginas del manual correspondientes para SWI-Prolog, [30] SICStus Prolog, [31] GNU Prolog. [32] El implementador decide si los términos serializados recibidos a través de la red se comparan con una especificación (después de que se ha producido la deserialización del flujo de caracteres) y cómo se comparan. Las gramáticas de cláusulas definidas integradas de Prolog se pueden aplicar en esa etapa.
El mecanismo de serialización general principal es el módulo pickle
de la biblioteca estándar , que alude al término de sistemas de base de datos pickling [33] [34] [35] para describir la serialización de datos ( unpickling para deserializar ). Pickle utiliza una máquina virtual simple basada en pila que registra las instrucciones utilizadas para reconstruir el objeto. Es un formato de serialización personalizable entre versiones pero inseguro (no seguro contra datos erróneos o maliciosos). Los datos malformados o construidos maliciosamente pueden hacer que el deserializador importe módulos arbitrarios e instancia cualquier objeto. [36] [37] La biblioteca estándar también incluye módulos que serializan en formatos de datos estándar: (con soporte integrado para tipos escalares y de colección básicos y capaz de soportar tipos arbitrarios a través de ganchos de codificación y decodificación). (con soporte para formatos de lista de propiedades XML y binarios ). (con soporte para el estándar de Representación de Datos Externos (XDR) como se describe en RFC 1014). Por último, se recomienda que un objeto sea evaluable en el entorno adecuado, lo que lo convierte en una combinación aproximada para Common Lisp . No todos los tipos de objetos se pueden seleccionar automáticamente, especialmente aquellos que contienen recursos del sistema operativo como los identificadores de archivos , pero los usuarios pueden registrar funciones de "reducción" y construcción personalizadas para admitir el pickling y unpickling de tipos arbitrarios. Pickle se implementó originalmente como el módulo Python puro, pero, en versiones de Python anteriores a 3.0, el módulo (también integrado) ofrece un rendimiento mejorado (hasta 1000 veces más rápido [36] ). El fue adaptado del proyecto Unladen Swallow . En Python 3, los usuarios siempre deben importar la versión estándar, que intenta importar la versión acelerada y retrocede a la versión Python pura. [38]json
plistlib
xdrlib
__repr__
print-object
pickle
cPickle
cPickle
R tiene la función dput
que escribe una representación de texto ASCII de un objeto R en un archivo o conexión. Una representación se puede leer desde un archivo usando dget
. [39] Más específicamente, la función serialize
serializa un objeto R en una conexión, siendo la salida un vector sin procesar codificado en formato hexadecimal. La unserialize
función permite leer un objeto desde una conexión o un vector sin procesar. [40]
REBOL serializará en un archivo ( save/all
) o en un string!
( mold/all
). Las cadenas y los archivos se pueden deserializar utilizando la función polimórfica . proporciona serialización de datos entre lenguajes en R, utilizando Protocol Buffers . [41]load
RProtoBuf
Ruby incluye el módulo estándar Marshal
con 2 métodos dump
y load
, similares a las utilidades estándar de Unix dump
y restore
. Estos métodos serializan en la clase estándar String
, es decir, se convierten efectivamente en una secuencia de bytes. Algunos objetos no se pueden serializar (hacerlo generaría una TypeError
excepción): enlaces, objetos de procedimiento, instancias de la clase IO, objetos singleton e interfaces. Si una clase requiere serialización personalizada (por ejemplo, requiere ciertas acciones de limpieza realizadas al volcar/restaurar), se puede hacer implementando 2 métodos: _dump
y _load
. El método de instancia _dump
debe devolver un String
objeto que contenga toda la información necesaria para reconstituir objetos de esta clase y todos los objetos referenciados hasta una profundidad máxima dada como un parámetro entero (un valor de -1 implica que la verificación de profundidad debe estar deshabilitada). El método de clase _load
debe tomar un String
y devolver un objeto de esta clase.
Serde
es la biblioteca, o caja, más utilizada para la serialización en Rust .
En general, los objetos no recursivos y no compartidos se pueden almacenar y recuperar en una forma legible para humanos utilizando el protocolo storeOn:
/ . El método genera el texto de una expresión de Smalltalk que, cuando se evalúa utilizando , recrea el objeto original. Este esquema es especial, ya que utiliza una descripción procedimental del objeto, no los datos en sí. Por lo tanto, es muy flexible, lo que permite que las clases definan representaciones más compactas. Sin embargo, en su forma original, no maneja estructuras de datos cíclicas ni conserva la identidad de referencias compartidas (es decir, dos referencias a un solo objeto se restaurarán como referencias a dos copias iguales, pero no idénticas). Para esto, existen varias alternativas portátiles y no portátiles. Algunas de ellas son específicas de una implementación o biblioteca de clases de Smalltalk en particular. Hay varias formas en Squeak Smalltalk de serializar y almacenar objetos. Las más fáciles y más utilizadas son los formatos de almacenamiento binario basados en serializadores. Además, los objetos agrupados se pueden almacenar y recuperar utilizando . Ambos proporcionan un denominado "marco de almacenamiento de objetos binarios", que admite la serialización y la recuperación de un formato binario compacto. Ambos manejan estructuras cíclicas, recursivas y compartidas, almacenamiento/recuperación de información de clases y metaclases e incluyen mecanismos para la migración de objetos "sobre la marcha" (es decir, para convertir instancias que fueron escritas por una versión anterior de una clase con un diseño de objetos diferente). Las API son similares (storeBinary/readBinary), pero los detalles de codificación son diferentes, lo que hace que estos dos formatos sean incompatibles. Sin embargo, el código Smalltalk/X es de código abierto y gratuito y se puede cargar en otros Smalltalks para permitir el intercambio de objetos entre dialectos. La serialización de objetos no forma parte de la especificación ANSI Smalltalk. Como resultado, el código para serializar un objeto varía según la implementación de Smalltalk. Los datos binarios resultantes también varían. Por ejemplo, un objeto serializado creado en Squeak Smalltalk no se puede restaurar en Ambrai Smalltalk. En consecuencia, varias aplicaciones que funcionan en múltiples implementaciones de Smalltalk que dependen de la serialización de objetos no pueden compartir datos entre estas diferentes implementaciones. Estas aplicaciones incluyen la base de datos de objetos MinneStore [42] y algunos paquetes RPC . Una solución a este problema es SIXX [43] , que es un paquete para múltiples Smalltalks que utiliza un formato basado en XML para la serialización.readFrom:
storeOn:
readFrom:
storeOn:/readFrom:
SmartRefStream
ImageSegments
La biblioteca estándar Swift proporciona dos protocolos, Encodable
y Decodable
(compuestos juntos como Codable
), que permiten serializar o deserializar instancias de tipos conformes desde JSON , listas de propiedades u otros formatos. [44] El compilador puede generar implementaciones predeterminadas de estos protocolos para tipos cuyas propiedades almacenadas también sean Decodable
o Encodable
.
Windows PowerShell implementa la serialización a través del cmdlet integradoExport-CliXML
. Export-CliXML
serializa objetos .NET y almacena el XML resultante en un archivo. Para reconstruir los objetos, utilice el Import-CliXML
cmdlet, que genera un objeto deserializado a partir del XML en el archivo exportado. Los objetos deserializados, a menudo conocidos como "bolsas de propiedades", no son objetos activos; son instantáneas que tienen propiedades, pero no métodos. Las estructuras de datos bidimensionales también se pueden (des)serializar en formato CSV mediante los cmdlets integrados Import-CSV
y Export-CSV
.
Permite tomar un objeto o un grupo de objetos, colocarlos en un disco o enviarlos a través de un mecanismo de transporte inalámbrico o por cable y, más tarde, tal vez en otra computadora, revertir el proceso y resucitar el objeto o los objetos originales. Los mecanismos básicos son aplanar el objeto o los objetos en una secuencia unidimensional de bits y convertir esa secuencia de bits nuevamente en el objeto o los objetos originales.
La serialización, que se explica a continuación, es un ejemplo de una herramienta que utilizan los objetos dentro de un sistema de objetos para operar en el gráfico en el que están integrados. Esto parece requerir la violación de la encapsulación proporcionada por el modelo de objetos puros.
Existen muchos tipos de serializadores que producen datos muy compactos con gran rapidez. Hay serializadores para mensajería, para almacenamiento de datos y para ordenar objetos. ¿Cuál es el mejor serializador en .NET?
Nuestra implementación hace uso de un mecanismo llamado "pickles", que convertirá entre cualquier estructura de datos fuertemente tipada y una representación de esa estructura adecuada para almacenar en archivos de disco permanentes. La operación Pickle.Write toma un puntero a una estructura de datos fuertemente tipada y entrega buffers de bits para escribir en el disco. Por el contrario, Pickle.Read lee buffers de bits del disco y entrega una copia de la estructura de datos original. (*) Esta conversión implica identificar las ocurrencias de direcciones en la estructura y disponer que cuando la estructura se vuelva a leer desde el disco, las direcciones se reemplacen con direcciones válidas en el entorno de ejecución actual. El mecanismo de pickle es completamente automático: está impulsado por las estructuras de tipado en tiempo de ejecución que están presentes para nuestro mecanismo de recolección de basura. ... (*) El pickling es bastante similar al concepto de marshalling en llamadas a procedimientos remotos. Pero, de hecho, nuestra implementación de pickling funciona únicamente interpretando en tiempo de ejecución la estructura de valores tipificados dinámicamente , mientras que nuestra implementación de RPC funciona únicamente generando código para la ordenación de valores tipificados estáticamente. Cada función se beneficiaría de la incorporación de los mecanismos de la otra, pero eso aún no se ha hecho.
Origen del nombre 'aplanamiento': Como quiero dejar el módulo original 'marshal' en paz, y Jim se quejó de que 'serialización' también significa algo totalmente diferente que es realmente relevante en el contexto del acceso
simultáneo
a objetos persistentes, utilizaré el término 'aplanamiento' a partir de ahora. ... (El sistema Modula-3 utiliza el término datos 'encurtidos' para este concepto. Probablemente ya hayan resuelto todos los problemas, y de una manera segura para los tipos :-)