Serialization और Marshaling में क्या अंतर है?


521

मुझे पता है कि कई वितरित तकनीकों (जैसे आरपीसी) के संदर्भ में, "मार्शलिंग" शब्द का उपयोग किया जाता है, लेकिन यह समझ में नहीं आता है कि यह कैसे सीरियल से अलग होता है। क्या वे दोनों वस्तुओं को बिट्स की श्रृंखला में नहीं बदल रहे हैं?

सम्बंधित:

Serialization क्या है?

ऑब्जेक्ट मार्शल क्या है?

जवाबों:


404

मार्शलिंग और क्रमांकन दूरस्थ प्रक्रिया कॉल के संदर्भ में शिथिल पर्यायवाची हैं , लेकिन आशय के मामले के रूप में शब्दार्थ रूप से भिन्न हैं।

विशेष रूप से, मार्शलिंग यहां से वहां पैरामीटर प्राप्त करने के बारे में है, जबकि क्रमांकन संरचित डेटा की नकल करने या एक आदिम रूप से एक बाइट स्ट्रीम से करने के बारे में है। इस अर्थ में, क्रमबद्धता एक अर्थ है मार्शमॉलिंग करना, आमतौर पर पास-बाय-वैल्यू शब्दार्थ को लागू करना।

किसी वस्तु का संदर्भ द्वारा मार्श किया जाना भी संभव है, जिस स्थिति में "तार पर" डेटा मूल वस्तु के लिए केवल स्थान की जानकारी है। हालांकि, इस तरह की वस्तु अभी भी मूल्य निर्धारण के लिए उत्तरदायी हो सकती है।

जैसा कि @ उल्लेख करता है, कोड आधार स्थान या ऑब्जेक्ट कार्यान्वयन कोड जैसे अतिरिक्त मेटाडेटा भी हो सकते हैं।


3
क्या एक शब्द है जिसका अर्थ है एक ही समय में क्रमबद्ध और deserialize? उन तरीकों के साथ एक इंटरफ़ेस के लिए एक नाम की आवश्यकता है।
रफियन

1
@ क्रैफ़ियन, क्या आपका मतलब उस वस्तु द्वारा कार्यान्वित किया गया इंटरफ़ेस है जो क्रमबद्धता और विचलन से गुजरता है, या प्रक्रिया के प्रबंधन के लिए ज़िम्मेदार वस्तु द्वारा? मेरे द्वारा सुझाए गए प्रमुख शब्द क्रमशः "सीरियल-योग्य" और "फॉर्मैटर" हैं; प्रमुख के साथ सजाने I, पूंजीकरण में परिवर्तन होता है, और इसके बाद आवश्यक होता है।
जेफरी हंटिन

@ जेफ्रीहैंटिन प्रक्रिया के प्रबंधन के लिए जिम्मेदार एक वस्तु जो मेरा मतलब है; मैं अब ISerializer का उपयोग कर रहा हूँ, लेकिन यह केवल आधा ही सही है :)
raffian

6
दूरसंचार में @raffian, हम एक घटक को कहते हैं जो क्रमबद्ध करता है और "SerDes" या "Serdes" का वर्णन करता है, आमतौर पर वरीयता के आधार पर sir-dez या sir-deez का उच्चारण किया जाता है। मुझे लगता है कि यह इसके निर्माण में "मॉडेम" (यानी "मॉड्यूलेटर-डेमोडुलेटर") के समान है।
davidA

2
@naki यह उद्योग-व्यापी है - यदि आप उच्च गति वाले FPGA डेटाशीट्स को देखते हैं, तो वे SERDES कार्यक्षमता का उल्लेख करेंगे, हालांकि वे सभी काफी आधुनिक हैं, 1990 के दशक में वापस जा रहे हैं। Google एनजीग्राम का सुझाव है कि यह 1980 के दशक में अधिक लोकप्रिय हो गया, हालांकि मुझे 1970
davidA

207

दोनों एक ही काम करते हैं - वह है ऑब्जेक्ट को क्रमबद्ध करना। Serialization का उपयोग वस्तुओं को स्थानांतरित करने या उन्हें स्टोर करने के लिए किया जाता है। परंतु:

  • सीरियलाइज़ेशन: जब आप किसी ऑब्जेक्ट को क्रमबद्ध करते हैं, तो उस ऑब्जेक्ट के भीतर केवल सदस्य डेटा बाइट स्ट्रीम को लिखा जाता है; वह कोड नहीं जो वास्तव में ऑब्जेक्ट को लागू करता है।
  • Marshalling: शब्द Marshalling का उपयोग तब किया जाता है जब हम दूरस्थ ऑब्जेक्ट (RMI) में ऑब्जेक्ट पास करने के बारे में बात करते हैं । मार्शल ऑब्जेक्ट में क्रमबद्ध है (सदस्य डेटा क्रमबद्ध है) + कोडबेस संलग्न है।

इसलिए सीरियललाइज़ेशन मार्शलिंग का हिस्सा है।

कोडबेस वह सूचना है जो ऑब्जेक्ट के रिसीवर को बताती है जहां इस ऑब्जेक्ट का कार्यान्वयन पाया जा सकता है। कोई भी प्रोग्राम जो सोचता है कि यह कभी भी किसी अन्य प्रोग्राम के लिए एक ऑब्जेक्ट पास कर सकता है जो कोडबेस को सेट करने से पहले इसे नहीं देख सकता है, ताकि रिसीवर को पता चल सके कि कोड कहां से डाउनलोड करना है, अगर उसके पास स्थानीय रूप से उपलब्ध कोड नहीं है। रिसीवर ऑब्जेक्ट को डिस्क्राइबलाइज करने पर, उसमें से कोडबेस लाएगा और उस लोकेशन से कोड लोड करेगा।


45
इस संदर्भ में कोडबेस का अर्थ क्या है, इसे परिभाषित करने के लिए +1
उमर सलेम

2
क्रमबद्धता के बिना मार्कशीट होती है। स्विंग्स invokeAndWaitऔर फ़ॉर्म देखें Invoke, जो क्रमांकन को शामिल किए बिना UI थ्रेड के लिए एक तुल्यकालिक कॉल को मार्शल करते हैं।
जेफरी हेन्टिन

2
"वह कोड जो वास्तव में ऑब्जेक्ट को लागू नहीं करता है": क्या इसका मतलब कक्षा के तरीकों से है? या इसका क्या मतलब है। क्या आप समझा सकते हैं।
विशाल आनंद

2
क्या मतलब the implementation of this object? आप का एक विशिष्ट उदाहरण दे सकता है Serializationऔर Marshalling?
Simin Jie

क्रमांकन के बिना मार्शल कुछ संदर्भों में होता है, जैसे कि जब एक फ़ंक्शन कॉल एक ही प्रक्रिया के भीतर थ्रेडिंग मॉडल (उदाहरण के लिए, साझा थ्रेड पूल और एकल-पिन-थ्रेड लाइब्रेरी) के बीच नियंत्रण प्रवाह को स्थानांतरित करता है। इसलिए मैं कहता हूं कि वे आरपीसी के संदर्भ में शिथिल पर्याय हैं ।
जेफरी हंटिन

94

से मार्शलिंग (कंप्यूटर साइंस) विकिपीडिया लेख:

"मार्शल" शब्द को पायथन मानक पुस्तकालय 1 में "क्रमबद्ध" का पर्याय माना जाता है , लेकिन जावा-संबंधित RFC 2713 में शब्द समानार्थक नहीं हैं:

किसी वस्तु को "मार्शाल" करने का अर्थ है अपने राज्य और कोडबेस (एस) को इस तरह से रिकॉर्ड करना कि जब मार्शल्ड ऑब्जेक्ट "अनमैर्सहेल्ड" हो, तो मूल ऑब्जेक्ट की एक कॉपी प्राप्त होती है, संभवतः ऑब्जेक्ट के क्लास एसेस को स्वचालित रूप से लोड करके। आप किसी भी ऑब्जेक्ट को मार्शल कर सकते हैं जो कि धारावाहिक या रिमोट है। मार्शल क्रमबद्धता की तरह है, सिवाय इसके कि मार्शलिंग भी कोडबेस रिकॉर्ड करता है। मार्शलिंग उस मार्शलींग में क्रमांकन से अलग है जो विशेष रूप से दूरस्थ वस्तुओं का व्यवहार करता है। (RFC 2713)

किसी वस्तु को "क्रमबद्ध" करने का अर्थ है कि अपने राज्य को एक बाइट स्ट्रीम में इस तरह परिवर्तित करना कि बाइट स्ट्रीम को ऑब्जेक्ट की कॉपी में वापस परिवर्तित किया जा सके।

तो, मार्शलिंग अपने राज्य के अतिरिक्त बाइट स्ट्रीम में किसी ऑब्जेक्ट के कोडबेस को भी बचाता है ।


1
आप एक वस्तु का मतलब है, अगर unserialized, बस राज्य कर सकते हैं, वहाँ कोई कोडबेस नहीं होगा अर्थात इसका कोई भी फ़ंक्शन नहीं कहा जा सकता है, यह सिर्फ एक संरचित डेटा प्रकार है। और, यदि उसी वस्तु को मार्शेल्ड किया जाता है, तो इसकी संरचना के साथ-साथ इसका कोडबेस भी होगा और एक बार इसके कार्य कह सकते हैं?
बजन

11
"कोडबेस" का वास्तव में मतलब "कोड" नहीं है। "How Codebase Works" ( goo.gl/VOM2Ym ) से कोडबेस, काफी सरलता से, RMI के शब्दार्थों का उपयोग करने वाले प्रोग्राम, जो नई कक्षाएँ खोजते हैं। जब किसी वस्तु का प्रेषक उस वस्तु को दूसरे JVM में प्रसारित करने के लिए क्रमबद्ध करता है, तो वह कोडबेस नामक सूचना के साथ बाइट्स की क्रमबद्ध धारा को एनोटेट करता है। यह जानकारी उस रिसीवर को बताती है जहां इस ऑब्जेक्ट का कार्यान्वयन पाया जा सकता है। कोडबेस एनोटेशन में संग्रहीत वास्तविक जानकारी URL की एक सूची है जिसमें से आवश्यक वस्तु के लिए क्लासफाइल को डाउनलोड किया जा सकता है।
ग्यूसेप बर्टोन

2
@Neurone यह परिभाषा Jini और RMI के लिए विशिष्ट है। "कोडबेस" एक सामान्य शब्द है। en.wikipedia.org/wiki/Codebase
Bill the Lizard

2
@BilltheLizard हाँ, लेकिन क्योंकि आप जावा में मार्शलिंग के बारे में बात कर रहे हैं, इसलिए यह कहना गलत है कि क्रमांकन और मार्शालिंग के बीच का अंतर "मार्शालिंग अपने राज्य के अलावा ऑब्जेक्ट के कोड को बचाता है", और यह भजन के प्रश्न की ओर जाता है। मार्शल वस्तु स्थिति के अतिरिक्त "कोडबेस" को बचाता है।
ज्यूसेप बर्टोन

19

मुझे लगता है कि मुख्य अंतर यह है कि मार्शलिंग में कोडबेस भी शामिल है। दूसरे शब्दों में, आप एक वस्तु को अलग वर्ग के एक राज्य-समतुल्य उदाहरण में नहीं बदल सकते हैं। ।

सीरियलाइज़ेशन का अर्थ केवल यह है कि आप ऑब्जेक्ट को स्टोर कर सकते हैं और एक बराबर स्थिति को पुनः प्राप्त कर सकते हैं, भले ही वह किसी अन्य वर्ग का उदाहरण हो।

कहा जा रहा है, वे आम तौर पर समानार्थी हैं।


2
क्या आपके पास ऑब्जेक्ट का मतलब है, यदि अनधिकृत, बस राज्य हो सकता है, तो कोई कोडबेस नहीं होगा अर्थात इसका कोई भी फ़ंक्शन नहीं कहा जा सकता है, यह सिर्फ एक संरचित डेटा प्रकार है। और, यदि उसी वस्तु को मार्शेल्ड किया जाता है, तो इसकी संरचना के साथ इसका कोडबेस भी होगा और कोई भी इसके कार्यों को कह सकता है?
बजन

18

मार्शलिंग एक फ़ंक्शन के हस्ताक्षर और मापदंडों को एकल बाइट सरणी में परिवर्तित करने के लिए संदर्भित करता है। विशेष रूप से आरपीसी के उद्देश्य के लिए।

Serialization अधिक बार एक संपूर्ण ऑब्जेक्ट / ऑब्जेक्ट ट्री को बाइट सरणी में परिवर्तित करने को संदर्भित करता है। Marshaling उन्हें संदेश में जोड़ने और इसे पूरे नेटवर्क में पास करने के लिए ऑब्जेक्ट मापदंडों को क्रमबद्ध करेगा। * डिस्क पर स्टोरेज के लिए सीरियलाइजेशन का भी इस्तेमाल किया जा सकता है। *


11

मार्शल यह संकलक बताने का नियम है कि डेटा को किसी अन्य वातावरण / प्रणाली पर कैसे दर्शाया जाएगा; उदाहरण के लिए;

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

जैसा कि आप दो अलग-अलग स्ट्रिंग मानों को विभिन्न मूल्य प्रकारों के रूप में दर्शा सकते हैं।

सीरियलाइज़ेशन केवल ऑब्जेक्ट कंटेंट को रूपांतरित करेगा, न कि प्रतिनिधित्व (वैसा ही रहेगा) और क्रमबद्धता के नियमों का पालन करता है, (क्या निर्यात करें या क्या नहीं)। उदाहरण के लिए, निजी मूल्य क्रमबद्ध नहीं होंगे, सार्वजनिक मूल्य हां और वस्तु संरचना समान रहेंगे।


7

यहाँ दोनों के अधिक विशिष्ट उदाहरण दिए गए हैं:

क्रमांकन उदाहरण:

#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 # के दृष्टिकोण से एक ब्लैक बॉक्स है।

एक और दिलचस्प अवधारणा यह है कि आपको समझ हो सकती है कि कोड कैसे लिखना है, और एक कंप्यूटर जो निर्देशों को निष्पादित करना जानता है, इसलिए एक प्रोग्रामर के रूप में, आप प्रभावी रूप से उस अवधारणा की नकल कर रहे हैं जो आप चाहते हैं कि कंप्यूटर आपके मस्तिष्क से कार्यक्रम तक पहुंचाए। छवि। यदि हमारे पास पर्याप्त मार्शलेयर हैं, तो हम बस सोच सकते हैं कि हम क्या करना / बदलना चाहते हैं, और कार्यक्रम कीबोर्ड पर टाइप किए बिना उस तरीके को बदल देगा। इसलिए, यदि आपके पास कुछ सेकंड के लिए अपने मस्तिष्क में सभी भौतिक परिवर्तनों को संग्रहीत करने का एक तरीका हो सकता है, जहां आप वास्तव में अर्धविराम लिखना चाहते हैं, तो आप उस डेटा को अर्धविराम प्रिंट करने के लिए एक संकेत में मार्शल कर सकते हैं, लेकिन यह एक चरम है।


4

मार्शलिंग आमतौर पर अपेक्षाकृत निकटता से जुड़ी प्रक्रियाओं के बीच होता है; जरूरी नहीं कि सीरियलाइजेशन में वह अपेक्षा हो। इसलिए, जब प्रक्रियाओं के बीच डेटा का मार्शलिंग किया जाता है, उदाहरण के लिए, आप पुनर्प्राप्त करने के लिए संभावित रूप से महंगे डेटा के लिए केवल एक संदर्भ भेजने के लिए इच्छा कर सकते हैं, जबकि क्रमांकन के साथ, आप वांछित होने पर ऑब्जेक्ट (ओं) को ठीक से फिर से बनाने के लिए यह सब सहेजना चाहेंगे।


4

मार्शलिंग की मेरी समझ अन्य उत्तरों के लिए अलग है।

क्रमबद्धता:

किसी कन्वेंशन का उपयोग करते हुए ऑब्जेक्ट ग्राफ के एक तार-प्रारूप संस्करण का उत्पादन या पुन: सक्रिय करने के लिए।

मार्शलिंग:

मैपिंग फ़ाइल का उपयोग करके किसी ऑब्जेक्ट ग्राफ़ के तार-प्रारूप संस्करण का उत्पादन या पुन: व्यवस्थित करने के लिए, ताकि परिणामों को अनुकूलित किया जा सके। उपकरण एक सम्मेलन का पालन करके शुरू हो सकता है, लेकिन महत्वपूर्ण अंतर परिणामों को अनुकूलित करने की क्षमता है।

अनुबंध पहले विकास:

अनुबंध पहले विकास के संदर्भ में मार्शलिंग महत्वपूर्ण है।

  • समय के साथ बाहरी इंटरफ़ेस को स्थिर रखते हुए, आंतरिक ऑब्जेक्ट ग्राफ़ में परिवर्तन करना संभव है। इस तरह सभी सेवा ग्राहकों को हर तुच्छ परिवर्तन के लिए संशोधित नहीं करना पड़ेगा।
  • विभिन्न भाषाओं में परिणामों को मैप करना संभव है। उदाहरण के लिए एक भाषा के संपत्ति नाम सम्मेलन ('संपत्ति_नाम') से दूसरे ('संपत्तिनाम') तक।

1
//, क्या मैं इसके बारे में अधिक जान सकता हूं, विशेष रूप से, "रिहाइड्रेट" का मतलब है, इसमें यहाँ उत्तर, @ जैस्परबेल्स? मुझे लगता है कि यह सिर्फ एस्ट्रोनॉट भोजन के लिए नहीं है।
नाथन बसानी

@NathanBasanese इस उत्तर के अनुसार - stackoverflow.com/a/6991192/5101816 - की परिभाषा (पुनः) हाइड्रेटिंग में निम्नलिखित शब्द हैं: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

मूल बातें पहले

बाइट स्ट्रीम - स्ट्रीम डेटा का अनुक्रम है। इनपुट स्ट्रीम - स्रोत से डेटा पढ़ता है। आउटपुट स्ट्रीम - डेटा को डिस्नेटेशन पर लिखता है। जावा बाइट स्ट्रीम का उपयोग बाइट द्वारा इनपुट / आउटपुट बाइट करने के लिए किया जाता है (एक बार में 8 बिट्स)। एक बाइट स्ट्रीम बाइनरी फ़ाइलों जैसे कच्चे डेटा को संसाधित करने के लिए उपयुक्त है। जावा कैरेक्टर स्ट्रीम का उपयोग एक बार में इनपुट / आउटपुट 2 बाइट्स करने के लिए किया जाता है, क्योंकि प्रत्येक चरित्र के लिए 2 बाइट्स के साथ जावा में यूनिकोड सम्मेलनों का उपयोग करके वर्ण संग्रहीत किए जाते हैं। कैरेक्टर स्ट्रीम तब उपयोगी होती है जब हम टेक्स्ट फाइल्स को प्रोसेस (रीड / राइट) करते हैं।

आरएमआई (रिमोट मेथड इनवोकेशन) - एक एपीआई जो जावा में वितरित एप्लिकेशन बनाने के लिए एक तंत्र प्रदान करता है। RMI किसी ऑब्जेक्ट को किसी अन्य JVM में चल रही ऑब्जेक्ट पर विधियों को लागू करने की अनुमति देती है।


Serialization और Marshalling दोनों समानार्थक शब्द के रूप में उपयोग किए जाते हैं। यहाँ कुछ अंतर हैं।

सीरियलाइज़ेशन - किसी ऑब्जेक्ट के डेटा सदस्यों को बाइनरी फॉर्म या बाइट स्ट्रीम (और फिर फ़ाइल / मेमोरी / डेटाबेस आदि में लिखा जा सकता है) लिखा जाता है। डेटा डेटा बाइनरी फॉर्म में लिखे जाने के बाद डेटा-प्रकारों के बारे में कोई जानकारी नहीं रखी जा सकती है।

यहाँ छवि विवरण दर्ज करें

मार्शलिंग - डेटा-प्रकार + कोडबेस के साथ ऑब्जेक्ट को क्रमबद्ध (बाइनरी स्ट्रीम में बाइट स्ट्रीम में) जोड़ा जाता है और फिर रिमोट ऑब्जेक्ट (आरएमआई) पास किया जाता है । मार्शल डेटा-प्रकार को पूर्वनिर्धारित नामकरण सम्मेलन में बदल देगा ताकि इसे प्रारंभिक डेटा-प्रकार के संबंध में फिर से संगठित किया जा सके। यहाँ छवि विवरण दर्ज करें

इसलिए सीरियललाइज़ेशन मार्शलिंग का हिस्सा है।

कोडबेस वह सूचना है जो ऑब्जेक्ट के रिसीवर को बताती है जहां इस ऑब्जेक्ट का कार्यान्वयन पाया जा सकता है। कोई भी प्रोग्राम जो सोचता है कि यह कभी भी किसी अन्य प्रोग्राम के लिए एक ऑब्जेक्ट पास कर सकता है जो कोडबेस को सेट करने से पहले इसे नहीं देख सकता है, ताकि रिसीवर को पता चल सके कि कोड कहां से डाउनलोड करना है, अगर उसके पास स्थानीय रूप से उपलब्ध कोड नहीं है। रिसीवर ऑब्जेक्ट को डिस्क्राइबलाइज करने पर, उसमें से कोडबेस लाएगा और उस लोकेशन से कोड लोड करेगा। (@ नासिर जवाब से कॉपी किया गया)

सीरियलाइज़ेशन लगभग ऑब्जेक्ट (एस) द्वारा उपयोग की जाने वाली मेमोरी के एक बेवकूफ मेमोरी-डंप की तरह है, जबकि मार्शल कस्टम डेटा-प्रकारों के बारे में जानकारी संग्रहीत करता है।

एक तरह से, सीरियलाइज़ेशन पास-दर-मूल्य के कार्यान्वयन के साथ मार्शेलिंग करता है क्योंकि डेटा-प्रकार की कोई भी जानकारी पारित नहीं की जाती है, बस आदिम रूप को बाइट स्ट्रीम में पारित किया जाता है।

यदि बड़े ओएस एक ही डेटा का प्रतिनिधित्व करने के अलग-अलग साधन हैं, तो धाराकरण में बड़े-एंडियन, छोटे-एंडियन से संबंधित कुछ मुद्दे हो सकते हैं यदि धारा एक ओएस से दूसरे में जा रही है। दूसरी ओर, मार्शलिंग ओएस के बीच प्रवास करने के लिए पूरी तरह से ठीक है क्योंकि परिणाम एक उच्च-स्तरीय प्रतिनिधित्व है।


1

Marshaling वास्तव में Serialization प्रक्रिया का उपयोग करता है लेकिन प्रमुख अंतर यह है कि यह Serialization में केवल डेटा सदस्यों और ऑब्जेक्ट को ही हस्ताक्षर नहीं किए जाते हैं, बल्कि Marshalling Object + code base (इसका कार्यान्वयन) में भी बाइट्स में तब्दील हो जाएगा।

मार्शलिंग JAXB का उपयोग करते हुए जावा ऑब्जेक्ट को xml ऑब्जेक्ट में बदलने की प्रक्रिया है, ताकि इसे वेब सेवाओं में उपयोग किया जा सके।


0

उन्हें समानार्थी के रूप में सोचें, दोनों के पास एक निर्माता है जो एक उपभोक्ता को सामान भेजता है ... उदाहरणों के अंतिम क्षेत्रों में एक बाइट स्ट्रीम में लिखा जाता है और दूसरा छोर रिवर्स होता है और एक ही उदाहरण के साथ बंद हो जाता है।

एनबी - जावा आरएमआई में उन वर्गों को परिवहन के लिए समर्थन शामिल है जो प्राप्तकर्ता से गायब हैं ...

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.