В чем разница между сериализацией и Маршалингом?

Я знаю, что с точки зрения нескольких распределенных методов (таких как RPC) используется термин "маршалинг", но не понимаю, чем он отличается от сериализации. Разве они оба не преобразуют объекты в серии битов?

по теме:

Что такое сериализация?

что такое маршалинг объектов?

11 ответов


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

в частности, маршалинг - это получение параметров отсюда туда, а сериализация-копирование структурированных данных в примитивную форму, такую как поток байтов. В этом смысле сериализация-это одно из средств маршалинга, обычно реализующее семантику pass-by-value.

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

Как упоминает @Bill, могут быть дополнительные метаданные, такие как местоположение базы кода или даже код реализации объекта.


оба делают одну общую вещь-это сериализация объект. Сериализация используется для передачи или хранения объектов. Но:

  • сериализация: при сериализации объекта в поток байтов записываются только данные-члены внутри этого объекта, а не код, который фактически реализует объект.
  • упорядочить: маршалинг термин используется, когда мы говорим о передача объекта на удаленный объекты (RMI). В Маршаллинге сериализуется объект (сериализуются данные члена) + кода прилагается.

таким образом, сериализация является частью маршалинга.

кода - это информация, которая сообщает получателю объекта, где можно найти реализацию этого объекта. Любая программа, которая думает, что она может передать объект другой программе, которая, возможно, не видела его раньше, должна установить кодовую базу, чтобы приемник может знать, откуда загрузить код, если у него нет кода, доступного локально. После десериализации объекта получатель извлекает из него кодовую базу и загружает код из этого места.


с маршалинг (информатика) статьи в Википедии:

термин "маршал" считается синонимом "сериализации" в стандартной библиотеке Python1, но термины не являются синонимами в связанном с Java RFC 2713:

до "маршала" объект означает записывать свое состояние и код(ы) таким образом, что, когда упорядоченный объект "неупорядоченными", копию исходного объекта, полученных, возможно, автоматическая загрузка определений классов объекта. Вы можете маршалировать любой объект, который является сериализуемым или удаленным. Маршалинг похож на сериализацию, за исключением маршалинга также записывает кодовые базы. Маршалинг отличается от сериализации тем, что маршалинг специально обрабатывает удаленные объекты. (RFC 2713)

для "сериализации" объекта означает преобразование его состояния в поток байтов таким образом, что поток байтов может быть преобразован обратно в копию объект.

Итак, упаковка сохраняет код объекта в потоке байтов в дополнение к его состоянию.


Я думаю, что основное различие заключается в том, что маршалинг предположительно также включает кодовую базу. Другими словами, вы не сможете маршалировать и unmarshal объект в эквивалентный состоянию экземпляр другого класса. .

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

Это, как говорится, они, как правило, синонимы.


маршалинг относится к преобразованию подписи и параметров функции в однобайтовый массив. специально для целей RPC.

сериализация чаще всего относится к преобразованию всего объекта / дерева объектов в массив байтов маршалинг сериализует параметры объекта, чтобы добавить их в сообщение и передать его по сети. * Сериализация также может использоваться для хранения на диске.*


упорядочить - Это правило, чтобы сообщить компилятору, как данные будут представлены на другой среде/системе; Например:

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
public string cFileName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)]
public string cAlternateFileName;

Как вы можете видеть, два разных строковых значения представлены как разные типы значений.

сериализация будет преобразовывать только содержимое объекта, а не представление (останется неизменным) и подчиняться правилам сериализации (что экспортировать или нет). Например, частные значения не будут сериализованы, общедоступные значения-да и структура объекта останется прежней.


маршаллинг обычно находится между относительно тесно связанными процессами; сериализация не обязательно имеет это ожидание. Поэтому при маршализации данных между процессами, например, вы можете просто отправить ссылку на потенциально дорогостоящие данные для восстановления, тогда как при сериализации вы хотели бы сохранить все это, чтобы правильно воссоздать объект(ы) при десериализации.


мое понимание маршалинга отличается от других ответов.

сериализация:

для создания или регидратации проволочной версии графа объектов с использованием соглашения.

упорядочить:

для создания или регидратации проводной версии графа объекта с помощью файла сопоставления, чтобы результаты можно было настроить. Инструмент может начать с присоединения к конвенции, но важно разница заключается в возможности настройки результатов.

Контракт Первая Разработка:

маршаллинг важен в контексте контрактной первой разработки.

  • его можно внести изменения во внутренний график объекта, сохраняя при этом внешний интерфейс стабильным с течением времени. Таким образом, все абоненты службы не должны быть изменены для каждого тривиального изменения.
  • его можно сопоставить результаты по несколько языков. Например, из соглашения имен свойств одного языка ('property_name') в другой ('propertyName').

думайте о них как о синонимах, у обоих есть производитель, который отправляет материал потребителю... В конце поля экземпляров записываются в поток байтов, а на другом конце - обратные и те же экземпляры.

NB-java RMI также содержит поддержку для транспортировки классов, которые отсутствуют у получателя...


вот более конкретные примеры:

Сериализации Пример:

#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;
}

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

Упорядочить Демо:

(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);    
}

при маршалинге данные не обязательно должны быть сглажены, но их необходимо преобразовать в другое альтернативное представление. все литье маршалинг, но не все маршалинг-это кастинг.

маршалинг не требует участия динамического распределения, он также может быть просто преобразованием между структурами. Например, у вас может быть пара, но функция ожидает, что первый и второй элементы пары будут другими; вы кастинг/memcpy одна пара к другой не будет выполнять эту работу, потому что fst и snd будут перевернуты.

#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;
}

концепция маршалинга становится особенно важной, когда вы начинаете заниматься с мечеными союзами многих типов. Например, вам может быть трудно заставить JavaScript-движок напечатать для вас" строку c", но вы можете попросить его напечатать для вас обернутую строку C. Или если вы хотите напечатать строку из среды выполнения JavaScript в среде Lua или Python. Все они-струны, но часто не могут обойтись без маршалинга.

недавно меня раздражало, что массивы JScript маршалируют на C# как "__ComObject" и не имеют документированного способа играть с этим объектом. Я может найти адрес, где он находится, но я действительно ничего не знаю об этом, поэтому единственный способ действительно выяснить это-ткнуть в него любым возможным способом и, надеюсь, найти полезную информацию об этом. Таким образом, становится проще создать новый объект с более дружественным интерфейсом, таким как сценарии.Словарь, скопируйте данные из объекта массива JScript в него и передайте этот объект в C# вместо массива по умолчанию JScript.


маршалинг фактически использует процесс сериализации, но основное отличие заключается в том, что в сериализации только члены данных и сам объект сериализуются не сигнатурами, а в Маршалировании Object + code base(его реализация) также преобразуются в байты.

маршаллинг-это процесс преобразования объекта java в объекты xml с помощью JAXB, чтобы его можно было использовать в веб-службах.