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



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



по теме:



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



что такое объект мобилизации?

952   11  

11 ответов:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

маршалинг относится к преобразованию сигнатуры и параметров функции в однобайтовый массив. специально для целей 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.в)

#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, чтобы его можно было использовать в веб-службах.

Comments

    Ничего не найдено.