Apa perbedaan antara Serialisasi dan Marshaling?

Jawaban:

405

Marshaling dan serialisasi secara longgar identik dalam konteks panggilan prosedur jarak jauh, tetapi secara semantik berbeda sebagai masalah niat.

Secara khusus, marshaling adalah tentang mendapatkan parameter dari sini ke sana, sementara serialisasi adalah tentang menyalin data terstruktur ke atau dari bentuk primitif seperti aliran byte. Dalam hal ini, serialisasi adalah salah satu cara untuk melakukan marshaling, biasanya menerapkan semantik nilai-demi-nilai.

Dimungkinkan juga untuk objek yang akan disusun dengan referensi, dalam hal ini data "pada kabel" hanyalah informasi lokasi untuk objek asli. Namun, objek seperti itu mungkin masih bisa menerima nilai serialisasi.

Seperti @Bill menyebutkan, mungkin ada metadata tambahan seperti lokasi basis kode atau bahkan kode implementasi objek.

Jeffrey Hantin
sumber
3
Apakah ada kata yang berarti serialisasi dan deserialize pada saat bersamaan? Perlu nama untuk antarmuka dengan metode-metode itu.
raffian
1
@raffian, maksud Anda antarmuka yang diimplementasikan oleh objek yang mengalami serialisasi dan deserialisasi, atau oleh objek yang bertanggung jawab untuk mengelola proses? Kata-kata kunci yang saya sarankan adalah "Serializable" dan "Formatter" masing-masing; hiasi dengan terkemuka I, perubahan kapitalisasi, dan sebagainya seperlunya.
Jeffrey Hantin
@ JeffreyHantin Objek yang bertanggung jawab untuk mengelola proses adalah apa yang saya maksud; Saya menggunakan ISerializer sekarang, tapi itu hanya setengah benar :)
raffian
6
@raffian dalam telekomunikasi, kami menyebut komponen yang membuat serial dan deserializes dengan "SerDes" atau "serdes", biasanya diucapkan sir-dez atau sir-deez tergantung pada preferensi. Saya kira itu mirip dengan "modem" (yaitu "Modulator-Demodulator") dalam konstruksinya.
davidA
2
@naki ini bersifat industri - jika Anda melihat lembar data FPGA berkecepatan tinggi, mereka akan menyebutkan fungsionalitas SERDES, meskipun semuanya cukup modern, kembali ke tahun 1990-an. Google NGrams menyarankannya menjadi lebih populer pada 1980-an, meskipun saya memang menemukan sebuah contoh dalam lembar data IBM dari tahun 1970
davidA
208

Keduanya melakukan satu hal yang sama - yaitu membuat serial objek. Serialisasi digunakan untuk mentransfer objek atau menyimpannya. Tapi:

  • Serialisasi: Ketika Anda membuat serial objek, hanya data anggota dalam objek yang ditulis ke aliran byte; bukan kode yang benar-benar mengimplementasikan objek.
  • Marshalling: Istilah Marshalling digunakan ketika kita berbicara tentang meneruskan Object ke objek jarak jauh (RMI) . Dalam Objek Marshalling adalah serial (data anggota serial) + Codebase dilampirkan.

Jadi Serialisasi adalah bagian dari Marshalling.

CodeBase adalah informasi yang memberi tahu penerima Obyek tempat implementasi objek ini dapat ditemukan. Program apa pun yang berpikir mungkin pernah meneruskan objek ke program lain yang mungkin belum pernah melihatnya sebelumnya harus menetapkan basis kode, sehingga penerima dapat mengetahui dari mana mengunduh kode, jika tidak tersedia kode secara lokal. Penerima akan, setelah deserializing objek, mengambil basis kode dari itu dan memuat kode dari lokasi itu.

Nasir Ali
sumber
45
+1 untuk mendefinisikan apa arti CodeBase dalam konteks ini
Omar Salem
2
Marshaling tanpa serialisasi memang terjadi. Lihat Swing's invokeAndWaitand Forms's Invoke, yang mengatur panggilan sinkron ke utas UI tanpa melibatkan serialisasi.
Jeffrey Hantin
2
"bukan kode yang benar-benar mengimplementasikan objek": Apakah ini berarti metode kelas? atau apa artinya ini. Tolong jelaskan.
Vishal Anand
2
Apa maksudmu the implementation of this object? Bisakah Anda memberikan contoh spesifik Serializationdan Marshalling?
Simin Jie
Marshalling tanpa serialisasi terjadi dalam beberapa konteks, seperti ketika panggilan fungsi mentransfer aliran kontrol antara model threading (misalnya, antara kumpulan thread bersama dan perpustakaan thread-pin-tunggal) dalam satu proses tunggal. Itu sebabnya saya katakan mereka secara longgar identik dalam konteks RPC .
Jeffrey Hantin
94

Dari artikel Wikipedia Marshalling (ilmu komputer) :

Istilah "marshal" dianggap identik dengan "bersambung" dalam pustaka standar Python 1 , tetapi istilah tersebut tidak sama dalam RFC 2713 terkait Java:

Untuk "marshal" suatu objek berarti merekam keadaan dan basis kode sedemikian rupa sehingga ketika objek marshalled "tidak dikunci", salinan objek asli diperoleh, mungkin dengan secara otomatis memuat definisi kelas dari objek tersebut. Anda dapat menyusun objek apa pun yang serializable atau jauh. Marshalling seperti serialisasi, kecuali marshalling juga merekam basis kode. Marshalling berbeda dari serialisasi dalam marshalling yang memperlakukan objek jarak jauh secara khusus. (RFC 2713)

Untuk "membuat cerita bersambung" suatu objek berarti mengubah kondisinya menjadi aliran byte sedemikian rupa sehingga aliran byte dapat diubah kembali menjadi salinan objek.

Jadi, marshalling juga menyimpan basis kode dari suatu objek dalam aliran byte di samping kondisinya.

Bill the Lizard
sumber
1
Maksud Anda sebuah Object, jika tidak di-serialisasi, hanya dapat memiliki status, tidak akan ada basis kode apa pun, yaitu tidak ada fungsinya yang dapat dipanggil, itu hanya tipe data terstruktur. Dan, jika objek yang sama dibuat marshalled maka ia akan memiliki basis kode bersama dengan struktur dan sekali dapat memanggil fungsinya?
bjan
11
"Codebase" tidak benar-benar berarti "Kode". Dari "Bagaimana Codebase Bekerja" ( goo.gl/VOM2Ym ) Codebase adalah, cukup sederhana, bagaimana program yang menggunakan semantik RMI tentang pemuatan kelas jarak jauh menemukan kelas baru. Ketika pengirim suatu objek membuat cerita bersambung dari objek tersebut untuk ditransmisikan ke JVM yang lain, ia mencatat aliran byte yang diserialisasi dengan informasi yang disebut basis kode. Informasi ini memberi tahu penerima di mana implementasi objek ini dapat ditemukan. Informasi aktual yang disimpan dalam anotasi basis kode adalah daftar URL dari mana classfile untuk objek yang diperlukan dapat diunduh.
Giuseppe Bertone
2
@Neurone Definisi itu khusus untuk Jini dan RMI. "Codebase" adalah istilah umum. en.wikipedia.org/wiki/Codebase
Bill the Lizard
2
@ BilltheLizard Ya, tetapi karena Anda berbicara tentang marshalling di Jawa, salah untuk mengatakan bahwa perbedaan antara serialisasi dan marshalling adalah "marshalling menyimpan kode objek selain statusnya", dan itu mengarah ke pertanyaan bjan. Marshalling menyimpan "basis kode" di samping status objek.
Giuseppe Bertone
19

Saya pikir perbedaan utama adalah bahwa Marshalling seharusnya juga melibatkan basis kode. Dengan kata lain, Anda tidak akan bisa meng-marshal dan meng-unmarshal sebuah objek ke instance setara-negara dari kelas yang berbeda. .

Serialisasi berarti bahwa Anda dapat menyimpan objek dan mendapatkan kembali keadaan yang setara, bahkan jika itu adalah instance dari kelas lain.

Yang sedang berkata, mereka biasanya sinonim.

Uri
sumber
2
Maksud Anda sebuah Object, jika tidak di-serialisasi, hanya dapat memiliki status, tidak akan ada basis kode apa pun, yaitu tidak ada fungsinya yang dapat dipanggil, itu hanya tipe data terstruktur. Dan, jika objek yang sama disusun maka ia akan memiliki basis kode bersama dengan struktur dan orang dapat memanggil fungsinya?
bjan
18

Marshaling mengacu pada konversi tanda tangan dan parameter fungsi menjadi array byte tunggal. Khusus untuk tujuan RPC.

Serialisasi lebih sering merujuk pada konversi seluruh objek / objek pohon ke dalam array byte. Marshaling akan membuat serialisasi parameter objek untuk menambahkannya ke pesan dan meneruskannya ke seluruh jaringan. * Serialisasi juga dapat digunakan untuk penyimpanan ke disk. *

H.Gankanda
sumber
11

Marshalling adalah aturan untuk memberi tahu kompiler bagaimana data akan diwakili pada lingkungan / sistem lain; Sebagai contoh;

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

karena Anda dapat melihat dua nilai string yang berbeda direpresentasikan sebagai tipe nilai yang berbeda.

Serialisasi hanya akan mengubah konten objek, bukan representasi (akan tetap sama) dan mematuhi aturan serialisasi, (apa yang diekspor atau tidak). Misalnya, nilai pribadi tidak akan diserialisasi, nilai publik ya dan struktur objek akan tetap sama.

Teoman shipahi
sumber
7

Berikut contoh yang lebih spesifik dari keduanya:

Contoh Serialisasi:

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

Dalam serialisasi, data diratakan dengan cara yang dapat disimpan dan tidak diratakan nanti.

Demo Marshalling:

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

Dalam marshaling, data tidak perlu perlu diratakan, tetapi perlu diubah ke representasi alternatif lain. semua casting adalah marshaling, tetapi tidak semua marshaling casting.

Marshaling tidak memerlukan alokasi dinamis untuk terlibat, itu juga bisa hanya transformasi antar struct. Misalnya, Anda mungkin memiliki pasangan, tetapi fungsinya mengharapkan elemen pertama dan kedua pasangan menjadi sebaliknya; Anda casting / memcpy satu pasangan ke yang lain tidak akan melakukan pekerjaan karena pertama dan snd akan terbalik.

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

Konsep marshaling menjadi sangat penting ketika Anda mulai berurusan dengan serikat yang ditandai dari banyak jenis. Misalnya, Anda mungkin kesulitan mendapatkan mesin JavaScript untuk mencetak "c string" untuk Anda, tetapi Anda dapat memintanya untuk mencetak c string yang dibungkus untuk Anda. Atau jika Anda ingin mencetak string dari runtime JavaScript dalam runtime Lua atau Python. Mereka semua adalah dawai, tetapi seringkali tidak rukun tanpa marshaling.

Sebuah gangguan yang saya miliki baru-baru ini adalah bahwa JScript array marshal ke C # sebagai "__ComObject", dan tidak memiliki cara yang terdokumentasi untuk bermain dengan objek ini. Saya dapat menemukan alamat di mana itu berada, tetapi saya benar-benar tidak tahu apa-apa lagi tentang itu, jadi satu-satunya cara untuk benar-benar mengetahuinya adalah dengan menyodoknya dengan cara apa pun yang mungkin dan semoga menemukan informasi yang berguna tentang itu. Sehingga menjadi lebih mudah untuk membuat objek baru dengan antarmuka yang lebih ramah seperti Scripting.Dictionary, menyalin data dari objek array JScript ke dalamnya, dan meneruskan objek itu ke C # alih-alih array standar 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);
        }
    }
}

di atas mencetak "__ComObject", yang agak dari kotak hitam dari sudut pandang C #.

Konsep lain yang menarik adalah bahwa Anda mungkin memiliki pemahaman cara menulis kode, dan komputer yang tahu cara menjalankan instruksi, sehingga sebagai seorang programmer, Anda secara efektif menyusun konsep tentang apa yang ingin dilakukan komputer dari otak Anda ke program. gambar. Jika kita memiliki marshaller yang cukup bagus, kita bisa memikirkan apa yang ingin kita lakukan / ubah, dan program akan berubah seperti itu tanpa mengetik pada keyboard. Jadi, jika Anda bisa memiliki cara untuk menyimpan semua perubahan fisik di otak Anda selama beberapa detik di mana Anda benar-benar ingin menulis titik koma, Anda dapat menyusun data menjadi sinyal untuk mencetak titik koma, tetapi itu ekstrem.

Dmitry
sumber
4

Marshalling biasanya antara proses yang relatif terkait; serialisasi tidak harus memiliki harapan itu. Jadi, ketika menyusun data antar proses, misalnya, Anda mungkin ingin mengirim REFERENSI ke data yang berpotensi mahal untuk dipulihkan, sedangkan dengan serialisasi, Anda ingin menyimpan semuanya, untuk membuat ulang objek dengan benar saat dideserialisasi.

Paul Sonier
sumber
4

Pemahaman saya tentang marshalling berbeda dengan jawaban lainnya.

Serialisasi:

Untuk Menghasilkan atau rehidrasi versi format-kawat dari grafik objek menggunakan konvensi.

Marshalling:

Untuk Menghasilkan atau rehidrasi versi format-kawat dari grafik objek dengan menggunakan file pemetaan, sehingga hasilnya dapat disesuaikan. Alat ini dapat mulai dengan mengikuti konvensi, tetapi perbedaan penting adalah kemampuan untuk menyesuaikan hasil.

Kontrak First Development:

Marshalling penting dalam konteks pengembangan kontrak pertama.

  • Mungkin untuk membuat perubahan pada objek grafik internal, sambil menjaga antarmuka eksternal stabil dari waktu ke waktu. Dengan cara ini, semua pelanggan layanan tidak perlu dimodifikasi untuk setiap perubahan sepele.
  • Mungkin untuk memetakan hasilnya di berbagai bahasa. Misalnya dari konvensi nama properti dari satu bahasa ('property_name') ke yang lain ('propertyName').
Jasper Blues
sumber
1
//, Boleh aku tahu lebih banyak tentang apa, khususnya, "rehydrate" artinya, dalam jawaban di sini, @JasperBlues? Saya menduga itu bukan hanya untuk makanan Astronaut.
Nathan Basanese
@NathanBasanese sesuai dengan jawaban ini - stackoverflow.com/a/6991192/5101816 - definisi (re) hydrating mengandung kata-kata berikut:Hydrating an object is taking an object that exists in memory, that doesn't yet contain any domain data ("real" data), and then populating it with domain data (such as from a database, from the network, or from a file system).
pxsx
3

Dasar-Dasar Pertama

Byte Stream - Stream adalah urutan data. Input stream - membaca data dari sumber. Output stream - menulis data ke desitnation. Java Byte Streams digunakan untuk melakukan input / output byte demi byte (8bits sekaligus). Aliran byte cocok untuk memproses data mentah seperti file biner. Java Character Streaming digunakan untuk melakukan input / output 2 byte pada suatu waktu, karena Karakter disimpan menggunakan konvensi Unicode di Jawa dengan 2 byte untuk setiap karakter. Aliran karakter berguna ketika kami memproses (membaca / menulis) file teks.

RMI (Remote Method Invocation) - API yang menyediakan mekanisme untuk membuat aplikasi terdistribusi di java. RMI memungkinkan objek untuk memanggil metode pada objek yang berjalan di JVM lain.


Baik Serialisasi dan Marshalling secara longgar digunakan sebagai sinonim. Berikut ini beberapa perbedaan.

Serialisasi - Data anggota suatu objek ditulis ke bentuk biner atau Aliran Byte (dan kemudian dapat ditulis dalam file / memori / database dll). Tidak ada informasi tentang tipe data yang dapat disimpan setelah anggota data objek ditulis ke bentuk biner.

masukkan deskripsi gambar di sini

Marshalling - Objek adalah serial (untuk byte stream dalam format biner) dengan tipe data + Codebase yang dilampirkan dan kemudian melewati Remote Object (RMI) . Marshalling akan mengubah tipe data menjadi konvensi penamaan yang telah ditentukan sehingga dapat direkonstruksi sehubungan dengan tipe data awal. masukkan deskripsi gambar di sini

Jadi Serialisasi adalah bagian dari Marshalling.

CodeBase adalah informasi yang memberi tahu penerima Obyek tempat implementasi objek ini dapat ditemukan. Program apa pun yang berpikir mungkin pernah meneruskan objek ke program lain yang mungkin belum pernah melihatnya sebelumnya harus menetapkan basis kode, sehingga penerima dapat mengetahui dari mana mengunduh kode, jika tidak tersedia kode secara lokal. Penerima akan, setelah deserializing objek, mengambil basis kode dari itu dan memuat kode dari lokasi itu. (Disalin dari jawaban @Nasir)

Serialisasi hampir seperti dump memori yang bodoh dari memori yang digunakan oleh objek, sementara Marshalling menyimpan informasi tentang tipe data kustom.

Di satu sisi, Serialization melakukan marshalling dengan implementasi nilai pass-by-value karena tidak ada informasi tipe data yang dilewatkan, hanya saja bentuk primitif diteruskan ke stream byte.

Serialisasi mungkin memiliki beberapa masalah yang terkait dengan big-endian, small-endian jika aliran berpindah dari satu OS ke OS lain jika OS yang berbeda memiliki cara berbeda untuk merepresentasikan data yang sama. Di sisi lain, marshalling baik-baik saja untuk bermigrasi di antara OS karena hasilnya adalah representasi tingkat yang lebih tinggi.

Om Sao
sumber
1

Marshaling menggunakan proses Serialisasi sebenarnya tetapi perbedaan utama adalah bahwa dalam Serialisasi hanya anggota data dan objek itu sendiri tidak berseri tanda tangan tetapi dalam Marshalling Object + basis kode (implementasinya) juga akan ditransformasikan menjadi byte.

Marshalling adalah proses untuk mengkonversi objek java ke objek xml menggunakan JAXB sehingga dapat digunakan dalam layanan web.

Aman Goel
sumber
0

Anggap mereka sebagai sinonim, keduanya memiliki produser yang mengirimkan barang ke konsumen ... Pada akhirnya bidang contoh ditulis ke dalam aliran byte dan ujung lainnya melawan sebaliknya dan muncul dengan contoh yang sama.

NB - java RMI juga berisi dukungan untuk mengangkut kelas yang hilang dari penerima ...

mP.
sumber