Jaka jest różnica między Serializacją a Marshalingiem?

Wiem, że w odniesieniu do kilku technik rozproszonych (takich jak RPC), termin "Marshaling" jest używany, ale nie rozumiem, czym różni się od serializacji. Czy obie nie przekształcają obiektów w Serie bitów?

Powiązane:

Czym jest serializacja?

Czym jest Object Marshalling?

Author: Community, 2009-04-21

11 answers

Marshaling i serializacja są luźno synonimiczne w kontekście zdalnego wywołania procedury, ale semantycznie różne w intencji.

W szczególności marshaling polega na pozyskiwaniu parametrów stąd do tam, podczas gdy serializacja polega na kopiowaniu ustrukturyzowanych danych do lub z prymitywnej formy, takiej jak strumień bajtów. W tym sensie serializacja jest jednym ze sposobów wykonywania marshalingu, Zwykle implementującym semantykę pass-by-value.

Możliwe jest również dla obiekt ma być ustawiony przez odniesienie, w którym to przypadku dane "na przewodzie" są po prostu informacją o lokalizacji dla oryginalnego obiektu. Jednak taki obiekt może być nadal podatny na serializację wartości.

Jak wspomina @Bill, mogą istnieć dodatkowe metadane, takie jak lokalizacja kodu bazowego lub nawet kod implementacji obiektu.

 296
Author: Jeffrey Hantin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-04 10:34:46

Obie mają jedną wspólną cechę - to jest serializowanie obiektu. Serializacja służy do przesyłania obiektów lub ich przechowywania. Ale:

  • serializacja: kiedy serializujesz obiekt, do strumienia bajtów zapisywane są tylko dane należące do tego obiektu; Nie kod, który faktycznie implementuje obiekt.
  • Marshalling: termin Marshalling jest używany, gdy mówimy o przekazywaniu obiektu do odległych obiektów(RMI) . W skład obiektu wchodzi serialized(dane członkowskie są serializowane) + kod jest załączony.

Więc serializacja jest częścią rozlokowania.

CodeBase jest informacją informującą odbiorcę o obiekcie, w którym można znaleźć implementację tego obiektu. Każdy program, który uważa, że może przekazać obiekt innemu programowi, który nie widział go wcześniej, musi ustawić bazę kodu, aby odbiorca wiedział, skąd pobrać kod, jeśli nie ma kodu dostępne lokalnie. Odbiorca, po deserializacji obiektu, pobierze z niego bazę kodową i załaduje kod z tej lokalizacji.

 125
Author: Nasir Ali,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-13 23:41:56

Z (Informatyka) Artykuł w Wikipedii:

Termin "marshal" jest uważany za synonim "serialize" w standardowej bibliotece Pythona1, jednak terminy nie są synonimiczne w RFC 2713 związanym z Javą:

Do "marshal" obiekt oznacza zapisanie jego stanu i bazy kodu w taki sposób, że gdy marshalled obiekt jest "unmarshalled", uzyskuje się kopię oryginalnego obiektu, prawdopodobnie przez automatyczne ładowanie definicje klas obiektu. Możesz wybrać dowolny obiekt, który jest serializowalny lub zdalny. Marshalling jest jak serializacja, z wyjątkiem marshalling również rejestruje bazy kodów. Marshalling różni się od serializacji tym, że marshalling traktuje odległe obiekty specjalnie. (RFC 2713)

Aby "serializować" obiekt oznacza przekształcenie jego stanu w strumień bajtów w taki sposób, że strumień bajtów może być przekształcony z powrotem do kopii obiektu.

Tak więc, marshalling również oszczędza kod obiektu w strumieniu bajtów oprócz jego stanu.

 82
Author: Bill the Lizard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-20 23:31:23

Myślę, że główną różnicą jest to, że Marshalling rzekomo obejmuje również bazę kodową. Innymi słowy, nie będzie można marszałek i unmarshal obiektu do stanu równoważnej instancji innej klasy. .

Serializacja oznacza po prostu, że możesz zapisać obiekt i ponownie uzyskać stan równoważny, nawet jeśli jest to instancja innej klasy.

To powiedziawszy, są one zazwyczaj synonimami.

 17
Author: Uri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-20 23:30:39

Marshaling odnosi się do konwersji podpisu i parametrów funkcji w pojedynczą tablicę bajtów. specjalnie dla potrzeb RPC.

Serializacja częściej odnosi się do konwersji całego obiektu / drzewa obiektów do tablicy bajtów Funkcja Marshaling serializuje parametry obiektu w celu dodania ich do wiadomości i przekazania jej przez sieć. * Serializacja może być również używana do przechowywania na dysku.*

 17
Author: H.Gankanda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-08 15:14:51

Marshalling jest regułą mówiącą kompilatorowi, jak dane będą reprezentowane w innym środowisku/systemie; Na przykład;

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

Jak widać dwie różne wartości łańcuchowe reprezentowane jako różne typy wartości.

Serializacja konwertuje tylko zawartość obiektu, a nie reprezentację (pozostanie taka sama) i przestrzega zasad serializacji (co eksportować lub nie). Na przykład wartości prywatne nie będą serializowane, wartości publiczne tak, a struktura obiektu pozostanie to samo.

 9
Author: Teoman shipahi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-12 17:54:36

Sortowanie zazwyczaj odbywa się pomiędzy relatywnie ściśle powiązanymi procesami; serializacja niekoniecznie musi mieć takie oczekiwania. Tak więc, gdy zbieramy dane między procesami, na przykład, możesz chcieć po prostu wysłać odniesienie do potencjalnie drogich danych do odzyskania, podczas gdy w przypadku serializacji chciałbyś zapisać je wszystkie, aby poprawnie odtworzyć obiekt(obiekty) po deserializacji.

 4
Author: Paul Sonier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-20 23:32:45

Moje rozumienie marshalling jest inne od innych odpowiedzi.

Serializacja:

Do wytworzenia lub ponownego nawodnienia drucianej wersji grafu obiektowego wykorzystującego konwencję.

Do wytworzenia lub ponownego nawodnienia wersji grafu Obiektowego w formacie przewodowym za pomocą pliku mapowania, aby można było dostosować wyniki. Narzędzie może rozpocząć się od przestrzegania konwencji, ale ważną różnicą jest możliwość dostosowania wyniki.

Pierwsze Opracowanie Umowy:

Marshalling jest ważny w kontekście pierwszego rozwoju umowy.

  • możliwe jest wprowadzanie zmian w wewnętrznym wykresie obiektów, przy zachowaniu stabilności interfejsu zewnętrznego w czasie. W ten sposób wszyscy subskrybenci serwisu nie będą musieli być modyfikowani dla każdej błahej zmiany.
  • możliwe jest mapowanie wyników w różnych językach. Na przykład z Konwencji nazwy własności jednego language ('property_name') to another ('propertyName').
 1
Author: Jasper Blues,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-26 04:38:20

Pomyśl o nich jak o synonimach, oba mają producenta, który wysyła rzeczy do konsumenta... Na końcu pola instancji są zapisywane w strumieniu bajtów, a na drugim końcu odwrotnie i w górę z tymi samymi instancjami.

NB-java RMI zawiera również wsparcie dla klas, których nie ma u odbiorcy...

 0
Author: mP.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-20 23:46:53

Oto bardziej szczegółowe przykłady obu:

Przykład Serializacji:

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

W serializacji dane są spłaszczane w sposób, który można później przechowywać i usuwać.

:

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

W marshalingu dane niekoniecznie muszą być spłaszczone, ale muszą zostać przekształcone w inną alternatywną reprezentację. wszystkie Castingi są marshalingiem, ale nie wszystkie marshalingi są casting.

Marshaling nie wymaga dynamicznej alokacji, może to być również transformacja pomiędzy strukturami. Na przykład, możesz mieć parę, ale funkcja spodziewa się, że pierwszy i drugi element pary będzie odwrotnie; rzucanie / memcpy z jednej pary do drugiej nie zadziała, ponieważ fst i snd zostaną odwrócone.

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

Pojęcie marshalingu staje się szczególnie ważne, gdy zaczyna się zajmować oznakowanymi związkami wielu typów. Na przykład, ty może być trudno uzyskać silnik JavaScript, aby wydrukować "ciąg c" dla ciebie, ale możesz poprosić go, aby wydrukować owinięty ciąg c dla Ciebie. Lub jeśli chcesz wydrukować ciąg z środowiska uruchomieniowego JavaScript w środowisku uruchomieniowym Lua lub Python. Wszystkie są sznurkami, ale często nie dogadują się bez marshalingu.

Dokuczliwością, jaką miałem ostatnio, było to, że tablice JScript zamieniają się w C# jako "_ _ ComObject " i nie ma udokumentowanego sposobu na zabawę z tym obiektem. Mogę znaleźć adres, gdzie to jest, ale naprawdę Nie wiem. wiem coś jeszcze o tym, więc jedynym sposobem, aby naprawdę dowiedzieć się, jest szturchnąć go w jakikolwiek możliwy sposób i mam nadzieję znaleźć przydatne informacje na ten temat. Dzięki temu łatwiej jest stworzyć nowy obiekt z bardziej przyjaznym interfejsem, takim jak Skrypty.Dictionary, skopiuj do niego dane z obiektu tablicy JScript i przekaż ten obiekt do C# zamiast domyślnej tablicy 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);
        }
    }
}

Powyżej wypisuje "_ _ ComObject", który jest coś w rodzaju czarnej skrzynki z punktu widzenia C#.

Inną ciekawą koncepcją jest to, że możesz mieć zrozumienie, jak pisać kod, i komputer, który wie, jak wykonywać instrukcje, więc jako programista, jesteś skutecznie przenosząc koncepcję tego, co chcesz, aby komputer robił z twojego mózgu do obrazu programu. Gdybyśmy mieli wystarczająco dobrych marszałków, moglibyśmy po prostu pomyśleć o tym, co chcemy zrobić/zmienić, a program zmieniłby się w ten sposób bez wpisywania na klawiatura. Tak więc, jeśli możesz mieć sposób na przechowywanie wszystkich fizycznych zmian w mózgu przez kilka sekund, gdzie naprawdę chcesz napisać średnik, możesz przekształcić te dane w sygnał, aby wydrukować średnik, ale to jest ekstremalne.

 0
Author: Dmitry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-10 07:53:52

Marshaling wykorzystuje proces serializacji, ale główną różnicą jest to, że w serializacji tylko elementy danych i sam obiekt otrzymują serialized nie sygnatury, ale w Marshalling Object + baza kodu(jego implementacja) również zostanie przekształcona w bajty.

Marshalling jest procesem konwersji obiektu java na obiekty xml za pomocą JAXB, aby mógł być używany w usługach internetowych.

 0
Author: Aman Goel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-14 11:01:31