Saya tahu bahwa dalam hal beberapa teknik terdistribusi (seperti RPC), istilah "Marshaling" digunakan tetapi tidak mengerti bagaimana ini berbeda dari Serialisasi. Bukankah mereka berdua mengubah objek menjadi serangkaian bit?
Saya tahu bahwa dalam hal beberapa teknik terdistribusi (seperti RPC), istilah "Marshaling" digunakan tetapi tidak mengerti bagaimana ini berbeda dari Serialisasi. Bukankah mereka berdua mengubah objek menjadi serangkaian bit?
Jawaban:
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.
I
, perubahan kapitalisasi, dan sebagainya seperlunya.
Keduanya melakukan satu hal yang sama - yaitu membuat serial objek. Serialisasi digunakan untuk mentransfer objek atau menyimpannya. Tapi:
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.
invokeAndWait
and Forms's Invoke
, yang mengatur panggilan sinkron ke utas UI tanpa melibatkan serialisasi.
the implementation of this object
? Bisakah Anda memberikan contoh spesifik Serialization
dan Marshalling
?
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.
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.
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. *
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.
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.
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.
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.
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).
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.
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.
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.
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.
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 ...