serialization - español - marshalling signals
¿Cuál es la diferencia entre la serialización y la clasificación? (11)
Sé que en términos de varias técnicas distribuidas (como RPC), se utiliza el término "cálculo de referencias" pero no entiendo en qué se diferencia de la serialización. ¿No están ambos transformando objetos en series de bits?
Relacionado:
Ambos hacen una cosa en común: es serializar un Objeto. La serialización se utiliza para transferir objetos o almacenarlos. Pero:
- Serialización: cuando serializa un objeto, solo los datos del miembro dentro de ese objeto se escriben en el flujo de bytes; No es el código que realmente implementa el objeto.
- Marshalling: Term Marshalling se usa cuando hablamos de pasar Objeto a objetos remotos (RMI) . En Marshalling, el objeto se serializa (los datos de los miembros se serializan) + se adjunta Codebase.
Así que la serialización es parte de Marshalling.
CodeBase es información que le dice al receptor de Object dónde se puede encontrar la implementación de este objeto. Cualquier programa que piense que podría pasar un objeto a otro que no lo haya visto antes debe configurar el código base, para que el receptor pueda saber de dónde descargar el código, si no tiene el código disponible localmente. El receptor, al deserializar el objeto, buscará el código base y cargará el código desde esa ubicación.
Aquí hay ejemplos más específicos de ambos:
Ejemplo de serialización:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
typedef struct {
char value[11];
} SerializedInt32;
SerializedInt32 SerializeInt32(int32_t x)
{
SerializedInt32 result;
itoa(x, result.value, 10);
return result;
}
int32_t DeserializeInt32(SerializedInt32 x)
{
int32_t result;
result = atoi(x.value);
return result;
}
int main(int argc, char **argv)
{
int x;
SerializedInt32 data;
int32_t result;
x = -268435455;
data = SerializeInt32(x);
result = DeserializeInt32(data);
printf("x = %s./n", data.value);
return result;
}
En la serialización, los datos se aplanan de una manera que se puede almacenar y desatascar posteriormente.
Demo Marshalling:
(MarshalDemoLib.cpp)
#include <iostream>
#include <string>
extern "C"
__declspec(dllexport)
void *StdCoutStdString(void *s)
{
std::string *str = (std::string *)s;
std::cout << *str;
}
extern "C"
__declspec(dllexport)
void *MarshalCStringToStdString(char *s)
{
std::string *str(new std::string(s));
std::cout << "string was successfully constructed./n";
return str;
}
extern "C"
__declspec(dllexport)
void DestroyStdString(void *s)
{
std::string *str((std::string *)s);
delete str;
std::cout << "string was successfully destroyed./n";
}
(MarshalDemo.c)
#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
int main(int argc, char **argv)
{
void *myStdString;
LoadLibrary("MarshalDemoLib");
myStdString = ((void *(*)(char *))GetProcAddress (
GetModuleHandleA("MarshalDemoLib"),
"MarshalCStringToStdString"
))("Hello, World!/n");
((void (*)(void *))GetProcAddress (
GetModuleHandleA("MarshalDemoLib"),
"StdCoutStdString"
))(myStdString);
((void (*)(void *))GetProcAddress (
GetModuleHandleA("MarshalDemoLib"),
"DestroyStdString"
))(myStdString);
}
En el cálculo de referencias, los datos no necesariamente tienen que ser aplanados, sino que deben transformarse en otra representación alternativa. todos los lanzamientos están formando referencias, pero no todos los lanzamientos son lanzamientos.
El cálculo no requiere una asignación dinámica para participar, sino que también puede ser una transformación entre estructuras. Por ejemplo, puede tener un par, pero la función espera que los elementos primero y segundo del par sean al revés; El envío de un par a otro de memcpy no hará el trabajo porque fst y snd se cambiarán.
#include <stdio.h>
typedef struct {
int fst;
int snd;
} pair1;
typedef struct {
int snd;
int fst;
} pair2;
void pair2_dump(pair2 p)
{
printf("%d %d/n", p.fst, p.snd);
}
pair2 marshal_pair1_to_pair2(pair1 p)
{
pair2 result;
result.fst = p.fst;
result.snd = p.snd;
return result;
}
pair1 given = {3, 7};
int main(int argc, char **argv)
{
pair2_dump(marshal_pair1_to_pair2(given));
return 0;
}
El concepto de cálculo de referencias se vuelve especialmente importante cuando comienza a tratar con uniones etiquetadas de muchos tipos. Por ejemplo, puede que le resulte difícil obtener un motor de JavaScript para imprimir una "cadena c" para usted, pero puede pedirle que imprima una cadena c envuelta para usted. O si desea imprimir una cadena desde el tiempo de ejecución de JavaScript en un tiempo de ejecución Lua o Python. Todas son cadenas, pero a menudo no se llevan bien sin calcularlas.
Una molestia que tuve recientemente fue que los arreglos JScript se combinan con C # como "__ComObject", y no tiene una forma documentada de jugar con este objeto. Puedo encontrar la dirección de dónde está, pero realmente no sé nada más sobre ella, por lo que la única forma de averiguarlo es buscarlo de cualquier manera posible y, con suerte, encontrar información útil al respecto. Por lo tanto, es más fácil crear un nuevo objeto con una interfaz más amigable como Scripting.Dictionary, copiar los datos del objeto de la matriz de JScript y pasar ese objeto a C # en lugar de la matriz predeterminada de JScript.
test.js:
var x = new ActiveXObject("Dmitry.YetAnotherTestObject.YetAnotherTestObject");
x.send([1, 2, 3, 4]);
YetAnotherTestObject.cs
using System;
using System.Runtime.InteropServices;
namespace Dmitry.YetAnotherTestObject
{
[Guid("C612BD9B-74E0-4176-AAB8-C53EB24C2B29"), ComVisible(true)]
public class YetAnotherTestObject
{
public void send(object x)
{
System.Console.WriteLine(x.GetType().Name);
}
}
}
arriba imprime "__ComObject", que es algo así como una caja negra desde el punto de vista de C #.
Otro concepto interesante es que usted puede entender cómo escribir código y una computadora que sabe cómo ejecutar las instrucciones, por lo que como programador, está calculando efectivamente el concepto de lo que quiere que la computadora haga desde su cerebro hasta el programa. imagen. Si tuviésemos suficientes comisarios, podríamos pensar en lo que queremos hacer / cambiar, y el programa cambiaría de esa manera sin teclear en el teclado. Por lo tanto, si pudiera tener una manera de almacenar todos los cambios físicos en su cerebro durante los pocos segundos en los que realmente desea escribir un punto y coma, podría convertir esos datos en una señal para imprimir un punto y coma, pero eso es un extremo.
Creo que la principal diferencia es que, supuestamente, Marshalling también implica el código base. En otras palabras, no podría convertir y desmarcar un objeto en una instancia de una clase diferente equivalente al estado. .
La serialización solo significa que puede almacenar el objeto y volver a obtener un estado equivalente, incluso si es una instancia de otra clase.
Dicho esto, son típicamente sinónimos.
Del artículo de Marshalling (informática) en Wikipedia:
El término "marshal" se considera sinónimo de "serializar" en la biblioteca estándar de Python 1 , pero los términos no son sinónimos en el RFC 2713 relacionado con Java:
Para "ordenar" un objeto significa registrar su estado y su (s) código (s) base (s) de forma que cuando el objeto seleccionado no está "marcado", se obtiene una copia del objeto original, posiblemente cargando automáticamente las definiciones de clase del objeto. Puede ordenar cualquier objeto que sea serializable o remoto. El cálculo es como la serialización, excepto que el registro también registra las bases de código. La separación es diferente de la serialización en que la asignación trata los objetos remotos especialmente. (RFC 2713)
Para "serializar" un objeto significa convertir su estado en un flujo de bytes de tal manera que el flujo de bytes se pueda volver a convertir en una copia del objeto.
Por lo tanto, la ordenación también guarda el código de un objeto en el flujo de bytes además de su estado.
El cálculo y la serialización son, en términos generales, sinónimos en el contexto de la llamada a un procedimiento remoto, pero semánticamente diferentes en cuanto a la intención.
En particular, el cálculo de referencias se trata de obtener parámetros de aquí para allá, mientras que la serialización consiste en copiar datos estructurados ao desde una forma primitiva, como un flujo de bytes. En este sentido, la serialización es un medio para realizar el cálculo de referencias, generalmente implementando semántica de paso por valor.
También es posible calcular un objeto por referencia, en cuyo caso los datos "en el cable" son simplemente información de ubicación para el objeto original. Sin embargo, tal objeto todavía puede ser susceptible de serialización de valores.
Como @Bill menciona, puede haber metadatos adicionales, como la ubicación de la base del código o incluso el código de implementación del objeto.
La clasificación suele ser entre procesos relativamente estrechamente asociados; La serialización no necesariamente tiene esa expectativa. Por lo tanto, al ordenar datos entre procesos, por ejemplo, es posible que desee simplemente enviar una REFERENCIA a datos potencialmente costosos para recuperarlos, mientras que con la serialización, desearía guardarlos todos, para recrear correctamente los objetos cuando se deserializa.
Los procesos de serialización utilizan el proceso de serialización en realidad, pero la principal diferencia es que en la serialización solo los miembros de datos y el propio objeto se serializan, no las firmas, pero en Marshalling Object + el código base (su implementación) también se transformará en bytes.
Marshalling es el proceso para convertir el objeto java en objetos xml usando JAXB para que pueda ser utilizado en servicios web.
Mi comprensión de la clasificación es diferente a las otras respuestas.
Publicación por entregas:
Para producir o rehidratar una versión en formato de cable de un gráfico de objetos utilizando una convención.
Marshalling:
Para producir o rehidratar una versión en formato de cable de un gráfico de objetos utilizando un archivo de mapeo, para que los resultados puedan personalizarse. La herramienta puede comenzar por adherirse a una convención, pero la diferencia importante es la capacidad de personalizar los resultados.
Contrato primer desarrollo:
La clasificación es importante en el contexto del primer desarrollo del contrato.
- Es posible realizar cambios en un gráfico de objeto interno, mientras se mantiene estable la interfaz externa a lo largo del tiempo. De esta manera, todos los suscriptores del servicio no tendrán que ser modificados por cada cambio trivial.
- Es posible mapear los resultados en diferentes idiomas. Por ejemplo, de la convención de nombre de propiedad de un idioma (''nombre_propiedad'') a otro (''nombre_propiedad'').
Piense en ellos como sinónimos, ambos tienen un productor que envía material a un consumidor ... Al final, los campos de las instancias se escriben en un flujo de bytes y el otro extremo contradice el reverso y arriba con las mismas instancias.
NB: java RMI también contiene soporte para el transporte de clases que faltan en el destinatario ...
El cálculo de referencias se refiere a convertir la firma y los parámetros de una función en una matriz de un solo byte. Específicamente para los fines de RPC.
La serialización se refiere más a menudo a la conversión de un objeto completo / árbol de objetos en una matriz de bytes. La clasificación en serie serializará los parámetros del objeto para agregarlos al mensaje y pasarlo a través de la red. * La serialización también se puede utilizar para el almacenamiento en disco. *
Marshalling es la regla para decirle al compilador cómo se representarán los datos en otro entorno / sistema; Por ejemplo;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
public string cFileName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)]
public string cAlternateFileName;
Como puede ver dos valores de cadena diferentes representados como diferentes tipos de valores.
La serialización solo convertirá el contenido del objeto, no la representación (permanecerá igual) y obedecerá las reglas de serialización (qué exportar o no). Por ejemplo, los valores privados no se serializarán, los valores públicos sí y la estructura del objeto permanecerán igual.