Подтвердить что ты не робот

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

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

Связанный:

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

Что такое Object Marshalling?

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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

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

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

Ответ 4

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

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

Как говорится, они обычно являются синонимами.

Ответ 5

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

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

Ответ 6

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

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

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

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

Ответ 7

Здесь более конкретные примеры обоих:

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

#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 маршалируются на С# как "__ComObject" и не имеют документального способа воспроизведения с этим объектом. Я могу найти адрес, где он есть, но я действительно ничего не знаю об этом, поэтому единственный способ понять это - это сделать все возможное и, надеюсь, найти полезную информацию об этом. Таким образом, становится проще создавать новый объект с более дружественным интерфейсом, таким как Scripting.Dictionary, копировать данные из объекта массива JScript в него и передавать этот объект на С# вместо массива по умолчанию 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);
        }
    }
}

выше печатает "__ComObject", который представляет собой черный ящик с точки зрения С#.

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

Ответ 8

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

Ответ 9

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

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

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

Ранжирование:

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

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

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

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

Ответ 10

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

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

Ответ 11

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

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