मुझे पता है कि कई वितरित तकनीकों (जैसे आरपीसी) के संदर्भ में, "मार्शलिंग" शब्द का उपयोग किया जाता है, लेकिन यह समझ में नहीं आता है कि यह कैसे सीरियल से अलग होता है। क्या वे दोनों वस्तुओं को बिट्स की श्रृंखला में नहीं बदल रहे हैं?
मुझे पता है कि कई वितरित तकनीकों (जैसे आरपीसी) के संदर्भ में, "मार्शलिंग" शब्द का उपयोग किया जाता है, लेकिन यह समझ में नहीं आता है कि यह कैसे सीरियल से अलग होता है। क्या वे दोनों वस्तुओं को बिट्स की श्रृंखला में नहीं बदल रहे हैं?
जवाबों:
मार्शलिंग और क्रमांकन दूरस्थ प्रक्रिया कॉल के संदर्भ में शिथिल पर्यायवाची हैं , लेकिन आशय के मामले के रूप में शब्दार्थ रूप से भिन्न हैं।
विशेष रूप से, मार्शलिंग यहां से वहां पैरामीटर प्राप्त करने के बारे में है, जबकि क्रमांकन संरचित डेटा की नकल करने या एक आदिम रूप से एक बाइट स्ट्रीम से करने के बारे में है। इस अर्थ में, क्रमबद्धता एक अर्थ है मार्शमॉलिंग करना, आमतौर पर पास-बाय-वैल्यू शब्दार्थ को लागू करना।
किसी वस्तु का संदर्भ द्वारा मार्श किया जाना भी संभव है, जिस स्थिति में "तार पर" डेटा मूल वस्तु के लिए केवल स्थान की जानकारी है। हालांकि, इस तरह की वस्तु अभी भी मूल्य निर्धारण के लिए उत्तरदायी हो सकती है।
जैसा कि @ उल्लेख करता है, कोड आधार स्थान या ऑब्जेक्ट कार्यान्वयन कोड जैसे अतिरिक्त मेटाडेटा भी हो सकते हैं।
I
, पूंजीकरण में परिवर्तन होता है, और इसके बाद आवश्यक होता है।
दोनों एक ही काम करते हैं - वह है ऑब्जेक्ट को क्रमबद्ध करना। Serialization का उपयोग वस्तुओं को स्थानांतरित करने या उन्हें स्टोर करने के लिए किया जाता है। परंतु:
इसलिए सीरियललाइज़ेशन मार्शलिंग का हिस्सा है।
कोडबेस वह सूचना है जो ऑब्जेक्ट के रिसीवर को बताती है जहां इस ऑब्जेक्ट का कार्यान्वयन पाया जा सकता है। कोई भी प्रोग्राम जो सोचता है कि यह कभी भी किसी अन्य प्रोग्राम के लिए एक ऑब्जेक्ट पास कर सकता है जो कोडबेस को सेट करने से पहले इसे नहीं देख सकता है, ताकि रिसीवर को पता चल सके कि कोड कहां से डाउनलोड करना है, अगर उसके पास स्थानीय रूप से उपलब्ध कोड नहीं है। रिसीवर ऑब्जेक्ट को डिस्क्राइबलाइज करने पर, उसमें से कोडबेस लाएगा और उस लोकेशन से कोड लोड करेगा।
invokeAndWait
और फ़ॉर्म देखें Invoke
, जो क्रमांकन को शामिल किए बिना UI थ्रेड के लिए एक तुल्यकालिक कॉल को मार्शल करते हैं।
the implementation of this object
? आप का एक विशिष्ट उदाहरण दे सकता है Serialization
और Marshalling
?
से मार्शलिंग (कंप्यूटर साइंस) विकिपीडिया लेख:
"मार्शल" शब्द को पायथन मानक पुस्तकालय 1 में "क्रमबद्ध" का पर्याय माना जाता है , लेकिन जावा-संबंधित RFC 2713 में शब्द समानार्थक नहीं हैं:
किसी वस्तु को "मार्शाल" करने का अर्थ है अपने राज्य और कोडबेस (एस) को इस तरह से रिकॉर्ड करना कि जब मार्शल्ड ऑब्जेक्ट "अनमैर्सहेल्ड" हो, तो मूल ऑब्जेक्ट की एक कॉपी प्राप्त होती है, संभवतः ऑब्जेक्ट के क्लास एसेस को स्वचालित रूप से लोड करके। आप किसी भी ऑब्जेक्ट को मार्शल कर सकते हैं जो कि धारावाहिक या रिमोट है। मार्शल क्रमबद्धता की तरह है, सिवाय इसके कि मार्शलिंग भी कोडबेस रिकॉर्ड करता है। मार्शलिंग उस मार्शलींग में क्रमांकन से अलग है जो विशेष रूप से दूरस्थ वस्तुओं का व्यवहार करता है। (RFC 2713)
किसी वस्तु को "क्रमबद्ध" करने का अर्थ है कि अपने राज्य को एक बाइट स्ट्रीम में इस तरह परिवर्तित करना कि बाइट स्ट्रीम को ऑब्जेक्ट की कॉपी में वापस परिवर्तित किया जा सके।
तो, मार्शलिंग अपने राज्य के अतिरिक्त बाइट स्ट्रीम में किसी ऑब्जेक्ट के कोडबेस को भी बचाता है ।
मुझे लगता है कि मुख्य अंतर यह है कि मार्शलिंग में कोडबेस भी शामिल है। दूसरे शब्दों में, आप एक वस्तु को अलग वर्ग के एक राज्य-समतुल्य उदाहरण में नहीं बदल सकते हैं। ।
सीरियलाइज़ेशन का अर्थ केवल यह है कि आप ऑब्जेक्ट को स्टोर कर सकते हैं और एक बराबर स्थिति को पुनः प्राप्त कर सकते हैं, भले ही वह किसी अन्य वर्ग का उदाहरण हो।
कहा जा रहा है, वे आम तौर पर समानार्थी हैं।
मार्शलिंग एक फ़ंक्शन के हस्ताक्षर और मापदंडों को एकल बाइट सरणी में परिवर्तित करने के लिए संदर्भित करता है। विशेष रूप से आरपीसी के उद्देश्य के लिए।
Serialization अधिक बार एक संपूर्ण ऑब्जेक्ट / ऑब्जेक्ट ट्री को बाइट सरणी में परिवर्तित करने को संदर्भित करता है। Marshaling उन्हें संदेश में जोड़ने और इसे पूरे नेटवर्क में पास करने के लिए ऑब्जेक्ट मापदंडों को क्रमबद्ध करेगा। * डिस्क पर स्टोरेज के लिए सीरियलाइजेशन का भी इस्तेमाल किया जा सकता है। *
मार्शल यह संकलक बताने का नियम है कि डेटा को किसी अन्य वातावरण / प्रणाली पर कैसे दर्शाया जाएगा; उदाहरण के लिए;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
public string cFileName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)]
public string cAlternateFileName;
जैसा कि आप दो अलग-अलग स्ट्रिंग मानों को विभिन्न मूल्य प्रकारों के रूप में दर्शा सकते हैं।
सीरियलाइज़ेशन केवल ऑब्जेक्ट कंटेंट को रूपांतरित करेगा, न कि प्रतिनिधित्व (वैसा ही रहेगा) और क्रमबद्धता के नियमों का पालन करता है, (क्या निर्यात करें या क्या नहीं)। उदाहरण के लिए, निजी मूल्य क्रमबद्ध नहीं होंगे, सार्वजनिक मूल्य हां और वस्तु संरचना समान रहेंगे।
यहाँ दोनों के अधिक विशिष्ट उदाहरण दिए गए हैं:
क्रमांकन उदाहरण:
#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);
}
मार्शलिंग में, डेटा को आवश्यक रूप से समतल करने की आवश्यकता नहीं होती है, लेकिन इसे दूसरे वैकल्पिक प्रतिनिधित्व में बदलने की आवश्यकता होती है। सभी कास्टिंग मार्शलिंग है, लेकिन सभी मार्शल कास्टिंग नहीं है।
मार्श्लिंग को शामिल होने के लिए गतिशील आवंटन की आवश्यकता नहीं होती है, यह सिर्फ संरचनाओं के बीच परिवर्तन भी हो सकता है। उदाहरण के लिए, आपके पास एक जोड़ी हो सकती है, लेकिन फ़ंक्शन को उम्मीद है कि जोड़ी का पहला और दूसरा तत्व चारों ओर अन्य तरीके से होंगे; आप कास्टिंग / मेम्की को एक जोड़ी को दूसरे में नहीं डालेंगे क्योंकि वह काम नहीं करेगा क्योंकि 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;
}
जब आप कई प्रकार के टैग किए गए यूनियनों के साथ काम करना शुरू करते हैं तो मार्शेलिंग की अवधारणा विशेष रूप से महत्वपूर्ण हो जाती है। उदाहरण के लिए, आपको अपने लिए "c string" प्रिंट करने के लिए जावास्क्रिप्ट इंजन प्राप्त करना मुश्किल हो सकता है, लेकिन आप इसे अपने लिए लिपटे c स्ट्रिंग को प्रिंट करने के लिए कह सकते हैं। या अगर आप Lua या Python रनटाइम में JavaScript रनटाइम से एक स्ट्रिंग प्रिंट करना चाहते हैं। वे सभी तार हैं, लेकिन अक्सर मार्शलिंग के बिना नहीं मिलेगा।
मेरे पास हाल ही में एक झुंझलाहट थी कि JScript ने मार्शल को C # के रूप में "__ComObject" के रूप में गिरफ्तार किया, और इस ऑब्जेक्ट के साथ खेलने का कोई दस्तावेजी तरीका नहीं है। मैं इसका पता लगा सकता हूं कि यह कहां है, लेकिन मुझे वास्तव में इसके बारे में और कुछ नहीं पता है, इसलिए वास्तव में इसका पता लगाने का एकमात्र तरीका यह है कि किसी भी तरह से संभव हो और इस बारे में उपयोगी जानकारी प्राप्त करें। इसलिए Scripting. सहारे जैसे मित्रवत इंटरफ़ेस के साथ एक नई ऑब्जेक्ट बनाना आसान हो जाता है, इसमें JScript सरणी ऑब्जेक्ट से डेटा कॉपी करें, और JScript के डिफ़ॉल्ट एरे के बजाय उस ऑब्जेक्ट को C # पास करें।
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", जो कुछ हद तक C # के दृष्टिकोण से एक ब्लैक बॉक्स है।
एक और दिलचस्प अवधारणा यह है कि आपको समझ हो सकती है कि कोड कैसे लिखना है, और एक कंप्यूटर जो निर्देशों को निष्पादित करना जानता है, इसलिए एक प्रोग्रामर के रूप में, आप प्रभावी रूप से उस अवधारणा की नकल कर रहे हैं जो आप चाहते हैं कि कंप्यूटर आपके मस्तिष्क से कार्यक्रम तक पहुंचाए। छवि। यदि हमारे पास पर्याप्त मार्शलेयर हैं, तो हम बस सोच सकते हैं कि हम क्या करना / बदलना चाहते हैं, और कार्यक्रम कीबोर्ड पर टाइप किए बिना उस तरीके को बदल देगा। इसलिए, यदि आपके पास कुछ सेकंड के लिए अपने मस्तिष्क में सभी भौतिक परिवर्तनों को संग्रहीत करने का एक तरीका हो सकता है, जहां आप वास्तव में अर्धविराम लिखना चाहते हैं, तो आप उस डेटा को अर्धविराम प्रिंट करने के लिए एक संकेत में मार्शल कर सकते हैं, लेकिन यह एक चरम है।
मार्शलिंग आमतौर पर अपेक्षाकृत निकटता से जुड़ी प्रक्रियाओं के बीच होता है; जरूरी नहीं कि सीरियलाइजेशन में वह अपेक्षा हो। इसलिए, जब प्रक्रियाओं के बीच डेटा का मार्शलिंग किया जाता है, उदाहरण के लिए, आप पुनर्प्राप्त करने के लिए संभावित रूप से महंगे डेटा के लिए केवल एक संदर्भ भेजने के लिए इच्छा कर सकते हैं, जबकि क्रमांकन के साथ, आप वांछित होने पर ऑब्जेक्ट (ओं) को ठीक से फिर से बनाने के लिए यह सब सहेजना चाहेंगे।
मार्शलिंग की मेरी समझ अन्य उत्तरों के लिए अलग है।
क्रमबद्धता:
किसी कन्वेंशन का उपयोग करते हुए ऑब्जेक्ट ग्राफ के एक तार-प्रारूप संस्करण का उत्पादन या पुन: सक्रिय करने के लिए।
मार्शलिंग:
मैपिंग फ़ाइल का उपयोग करके किसी ऑब्जेक्ट ग्राफ़ के तार-प्रारूप संस्करण का उत्पादन या पुन: व्यवस्थित करने के लिए, ताकि परिणामों को अनुकूलित किया जा सके। उपकरण एक सम्मेलन का पालन करके शुरू हो सकता है, लेकिन महत्वपूर्ण अंतर परिणामों को अनुकूलित करने की क्षमता है।
अनुबंध पहले विकास:
अनुबंध पहले विकास के संदर्भ में मार्शलिंग महत्वपूर्ण है।
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).
बाइट स्ट्रीम - स्ट्रीम डेटा का अनुक्रम है। इनपुट स्ट्रीम - स्रोत से डेटा पढ़ता है। आउटपुट स्ट्रीम - डेटा को डिस्नेटेशन पर लिखता है। जावा बाइट स्ट्रीम का उपयोग बाइट द्वारा इनपुट / आउटपुट बाइट करने के लिए किया जाता है (एक बार में 8 बिट्स)। एक बाइट स्ट्रीम बाइनरी फ़ाइलों जैसे कच्चे डेटा को संसाधित करने के लिए उपयुक्त है। जावा कैरेक्टर स्ट्रीम का उपयोग एक बार में इनपुट / आउटपुट 2 बाइट्स करने के लिए किया जाता है, क्योंकि प्रत्येक चरित्र के लिए 2 बाइट्स के साथ जावा में यूनिकोड सम्मेलनों का उपयोग करके वर्ण संग्रहीत किए जाते हैं। कैरेक्टर स्ट्रीम तब उपयोगी होती है जब हम टेक्स्ट फाइल्स को प्रोसेस (रीड / राइट) करते हैं।
आरएमआई (रिमोट मेथड इनवोकेशन) - एक एपीआई जो जावा में वितरित एप्लिकेशन बनाने के लिए एक तंत्र प्रदान करता है। RMI किसी ऑब्जेक्ट को किसी अन्य JVM में चल रही ऑब्जेक्ट पर विधियों को लागू करने की अनुमति देती है।
Serialization और Marshalling दोनों समानार्थक शब्द के रूप में उपयोग किए जाते हैं। यहाँ कुछ अंतर हैं।
सीरियलाइज़ेशन - किसी ऑब्जेक्ट के डेटा सदस्यों को बाइनरी फॉर्म या बाइट स्ट्रीम (और फिर फ़ाइल / मेमोरी / डेटाबेस आदि में लिखा जा सकता है) लिखा जाता है। डेटा डेटा बाइनरी फॉर्म में लिखे जाने के बाद डेटा-प्रकारों के बारे में कोई जानकारी नहीं रखी जा सकती है।
मार्शलिंग - डेटा-प्रकार + कोडबेस के साथ ऑब्जेक्ट को क्रमबद्ध (बाइनरी स्ट्रीम में बाइट स्ट्रीम में) जोड़ा जाता है और फिर रिमोट ऑब्जेक्ट (आरएमआई) पास किया जाता है । मार्शल डेटा-प्रकार को पूर्वनिर्धारित नामकरण सम्मेलन में बदल देगा ताकि इसे प्रारंभिक डेटा-प्रकार के संबंध में फिर से संगठित किया जा सके।
इसलिए सीरियललाइज़ेशन मार्शलिंग का हिस्सा है।
कोडबेस वह सूचना है जो ऑब्जेक्ट के रिसीवर को बताती है जहां इस ऑब्जेक्ट का कार्यान्वयन पाया जा सकता है। कोई भी प्रोग्राम जो सोचता है कि यह कभी भी किसी अन्य प्रोग्राम के लिए एक ऑब्जेक्ट पास कर सकता है जो कोडबेस को सेट करने से पहले इसे नहीं देख सकता है, ताकि रिसीवर को पता चल सके कि कोड कहां से डाउनलोड करना है, अगर उसके पास स्थानीय रूप से उपलब्ध कोड नहीं है। रिसीवर ऑब्जेक्ट को डिस्क्राइबलाइज करने पर, उसमें से कोडबेस लाएगा और उस लोकेशन से कोड लोड करेगा। (@ नासिर जवाब से कॉपी किया गया)
सीरियलाइज़ेशन लगभग ऑब्जेक्ट (एस) द्वारा उपयोग की जाने वाली मेमोरी के एक बेवकूफ मेमोरी-डंप की तरह है, जबकि मार्शल कस्टम डेटा-प्रकारों के बारे में जानकारी संग्रहीत करता है।
एक तरह से, सीरियलाइज़ेशन पास-दर-मूल्य के कार्यान्वयन के साथ मार्शेलिंग करता है क्योंकि डेटा-प्रकार की कोई भी जानकारी पारित नहीं की जाती है, बस आदिम रूप को बाइट स्ट्रीम में पारित किया जाता है।
यदि बड़े ओएस एक ही डेटा का प्रतिनिधित्व करने के अलग-अलग साधन हैं, तो धाराकरण में बड़े-एंडियन, छोटे-एंडियन से संबंधित कुछ मुद्दे हो सकते हैं यदि धारा एक ओएस से दूसरे में जा रही है। दूसरी ओर, मार्शलिंग ओएस के बीच प्रवास करने के लिए पूरी तरह से ठीक है क्योंकि परिणाम एक उच्च-स्तरीय प्रतिनिधित्व है।
Marshaling वास्तव में Serialization प्रक्रिया का उपयोग करता है लेकिन प्रमुख अंतर यह है कि यह Serialization में केवल डेटा सदस्यों और ऑब्जेक्ट को ही हस्ताक्षर नहीं किए जाते हैं, बल्कि Marshalling Object + code base (इसका कार्यान्वयन) में भी बाइट्स में तब्दील हो जाएगा।
मार्शलिंग JAXB का उपयोग करते हुए जावा ऑब्जेक्ट को xml ऑब्जेक्ट में बदलने की प्रक्रिया है, ताकि इसे वेब सेवाओं में उपयोग किया जा सके।
उन्हें समानार्थी के रूप में सोचें, दोनों के पास एक निर्माता है जो एक उपभोक्ता को सामान भेजता है ... उदाहरणों के अंतिम क्षेत्रों में एक बाइट स्ट्रीम में लिखा जाता है और दूसरा छोर रिवर्स होता है और एक ही उदाहरण के साथ बंद हो जाता है।
एनबी - जावा आरएमआई में उन वर्गों को परिवहन के लिए समर्थन शामिल है जो प्राप्तकर्ता से गायब हैं ...