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

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

Связанный:

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

Что такое Object Marshalling?

332
задан 21 апр. '09 в 2:26
источник поделиться
11 ответов

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

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

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

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

245
ответ дан 21 апр. '09 в 2:42
источник

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

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

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

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

 

101
ответ дан 02 февр. '13 в 5:50
источник

Из Маршаллинг (информатика) Статья в Википедии:

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

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

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

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

80
ответ дан 21 апр. '09 в 2:31
источник

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

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

16
ответ дан 08 окт. '11 в 18:14
источник

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

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

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

16
ответ дан 21 апр. '09 в 2:30
источник

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

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

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

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

8
ответ дан 12 марта '15 в 20:54
источник

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

4
ответ дан 21 апр. '09 в 2:32
источник

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

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

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

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

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

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

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

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

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

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

#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", который представляет собой черный ящик с точки зрения С#.

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

0
ответ дан 10 сент. '17 в 9:41
источник

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

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

0
ответ дан 14 нояб. '17 в 14:01
источник

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

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

0
ответ дан 21 апр. '09 в 2:46
источник

Другие вопросы по меткам или Задайте вопрос