सेव करें और लोड करें

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

Blockly इस डेटा के लिए दो फ़ॉर्मैट उपलब्ध कराता है: JSON और XML. हमारा सुझाव है कि नए प्रोजेक्ट के लिए, JSON सिस्टम का इस्तेमाल करें. साथ ही, एक्सएमएल का इस्तेमाल करने वाले पुराने प्रोजेक्ट को अपग्रेड करने का सुझाव दें. एक्सएमएल सिस्टम, सेव करने का लेगसी फ़ॉर्मैट है. इसे हटाया नहीं जाएगा, लेकिन इसमें नई सुविधाएं नहीं मिलेंगी.

JSON सिस्टम

JSON सीरियलाइज़ेशन सिस्टम, कई सीरियलाइज़र से बना होता है. ब्लॉक और वैरिएबल के लिए, पहले से मौजूद सीरियलाइज़र होते हैं. साथ ही, ज़्यादा सीरियलाइज़र भी रजिस्टर किए जा सकते हैं. हर सिरियलाइज़र, किसी खास प्लग इन या सिस्टम की स्थिति को सिरियलाइज़ और डिसिरियलाइज़ करने के लिए ज़िम्मेदार होता है.

सेव और लोड करना

फ़ाइल फ़ोल्डर

workspaces नेमस्पेस पर save और load तरीकों को कॉल करके, पूरे फ़ाइल फ़ोल्डर की स्थिति को सीरियलाइज़ या डीसीरियलाइज़ किया जा सकता है.

const state = Blockly.serialization.workspaces.save(myWorkspace);
Blockly.serialization.workspaces.load(state, myWorkspace);

ये कॉल, Workspace में रजिस्टर किए गए सभी अलग-अलग सिस्टम (जिन्हें सिरियलाइज़र से दिखाया जाता है) को सिरियलाइज़ या डिसिरियलाइज़ करते हैं.

अलग-अलग ब्लॉक

blocks नेमस्पेस पर save और append तरीकों को कॉल करके, अलग-अलग ब्लॉक को सीरियलाइज़ या डीसीरियलाइज़ किया जा सकता है.

const blockJson = Blockly.serialization.blocks.save(myBlock);
const duplicateBlock =
    Blockly.serialization.blocks.append(blockJson, myWorkspace);

अलग-अलग सिस्टम

अलग-अलग सिस्टम (जैसे, ब्लॉक, वैरिएबल, प्लग इन वगैरह) को सीरियलाइज़ या डीसीरियलाइज़ किया जा सकता है. इसके लिए, आपको उस सिस्टम से जुड़ा सीरियलाइज़र बनाना होगा और उसके save और load तरीकों को कॉल करना होगा.

// Saves only the variables information for the workspace.
const serializer = new Blockly.serialization.variables.VariableSerializer();
const state = serializer.save(myWorkspace);
serializer.load(state, myWorkspace);

डेसिरियलाइज़ेशन का क्रम

JSON सिस्टम में, डेटा को सीरियलाइज़ करने का क्रम साफ़ तौर पर तय होता है. इससे, सेव किए गए डेटा में डुप्लीकेट स्टेटस को रोकना आसान हो जाता है.

Blockly.serialization.workspaces.load को कॉल करने पर, प्राथमिकता के क्रम में डेसीरियलाइज़ करने के लिए, सिरियलाइज़र को स्टेटस दिया जाता है. इस बारे में ज़्यादा जानकारी, Serializers सेक्शन में दी गई है. इसका मकसद, serializers को दूसरे सिस्टम की स्थिति पर निर्भर होने की अनुमति देना है.

पहले से मौजूद सीरियलाइज़र को डीसीरियलाइज़ करने का क्रम यह है:

  1. वैरिएबल मॉडल को फिर से सीरियल में बदल दिया जाता है.
  2. प्रोसेस मॉडल को फिर से सीरियलाइज़ किया जाता है.
  3. ब्लॉक को डिसीरियलाइज़ किया जाता है. अलग-अलग टॉप-लेवल ब्लॉक को किसी भी क्रम में डीसीरीयलाइज़ किया जाता है.
    1. टाइप को डिसीरियलाइज़ किया गया है. यह ब्लॉक बनाता है, उसके init method को ट्रिगर करता है, और एक्सटेंशन को ब्लॉक में शामिल करता है.
    2. एट्रिब्यूट को डिसीरियलाइज़ किया जाता है. इसमें ऐसी प्रॉपर्टी शामिल हैं जो किसी भी ब्लॉक पर लागू हो सकती हैं. उदाहरण के लिए: x, y, छोटा किया गया, बंद है, और डेटा.
  4. अतिरिक्त स्टेटस को डिसीरियलाइज़ किया जाता है. ज़्यादा जानकारी के लिए, बदलाव करने वाले टूल का दस्तावेज़ देखें.
  5. ब्लॉक, अपने पैरंट से कनेक्ट हो (अगर कोई पैरंट मौजूद है).
    1. आइकॉन को फिर से सीरियल में बदला जाता है. अलग-अलग आइकॉन को किसी भी क्रम में डेसिरियलाइज़ किया जाता है.
    2. फ़ील्ड को डिसीरियलाइज़ किया जाता है. अलग-अलग फ़ील्ड को किसी भी क्रम में डेसीरियलाइज़ किया जाता है.
    3. इनपुट ब्लॉक को डिसीरियलाइज़ किया जाता है. इसमें वैल्यू इनपुट और स्टेटमेंट इनपुट से जुड़े ब्लॉक शामिल हैं. अलग-अलग इनपुट को किसी भी क्रम में, डिससिरियलाइज़ किया जाता है.
    4. अगले ब्लॉक को डिसीरियलाइज़ किया जाता है.

अतिरिक्त स्टेटस कब सेव करना चाहिए

ब्लॉक के लिए, अगर आपके पास ऑर्डर में नीचे की कोई चीज़ है जो ऑर्डर में ऊपर की किसी चीज़ पर निर्भर करती है, तो आपको उस डेटा की डुप्लीकेट कॉपी बनाकर, उसे अपनी अतिरिक्त स्थिति में जोड़ना चाहिए.

उदाहरण के लिए, अगर आपका कोई फ़ील्ड सिर्फ़ तब मौजूद होता है, जब अगला ब्लॉक कनेक्ट होता है, तो आपको अतिरिक्त स्टेटस में उस अगले ब्लॉक की जानकारी जोड़नी चाहिए. इससे, फ़ील्ड की स्थिति को डिसीरियलाइज़ करने से पहले, फ़ील्ड को आपके ब्लॉक में जोड़ा जा सकता है.

हालांकि, अगर आपका कोई ऐसा इनपुट है जो सिर्फ़ तब मौजूद होता है, जब किसी फ़ील्ड में कोई खास वैल्यू हो, तो आपको अतिरिक्त स्टेटस में फ़ील्ड की जानकारी जोड़ने की ज़रूरत नहीं है. ऐसा इसलिए है, क्योंकि पहले आपके फ़ील्ड की स्थिति को डिसीरियलाइज़ किया जाएगा. इसके बाद, अपने ब्लॉक में इनपुट जोड़ा जा सकता है. आम तौर पर, इनपुट जोड़ने की प्रोसेस, पुष्टि करने वाले टूल से ट्रिगर होगी.

ध्यान दें कि डुप्लीकेट स्टेटस के नियम में यह भी ध्यान रखना चाहिए कि ब्लॉक स्टैक, आइकॉन, फ़ील्ड, और इनपुट ब्लॉक को किसी भी क्रम में डिसीरियलाइज़ किया जाता है. उदाहरण के लिए, अगर आपके पास एक फ़ील्ड B है जो सिर्फ़ तब मौजूद होता है, जब किसी दूसरे फ़ील्ड A में कोई खास वैल्यू हो, तो आपको अतिरिक्त स्टेटस में A के बारे में जानकारी जोड़नी चाहिए. ऐसा तब करना होगा, जब B को A से पहले डिससिरियलाइज़ किया जाए.

ब्लॉक हुक

ब्लॉक में अतिरिक्त सीरियलाइज़ेशन जोड़ने के तरीके के बारे में जानने के लिए, Mutators दस्तावेज़ देखें.

फ़ील्ड हुक

फ़ील्ड को क्रम से लगाने के तरीके के बारे में जानने के लिए, कस्टम फ़ील्ड दस्तावेज़ देखें.

Serializer हुक

JSON सिस्टम की मदद से, ऐसे सिरियलाइज़र रजिस्टर किए जा सकते हैं जो किसी स्थिति को सिरियलाइज़ और डिसिरियलाइज़ करते हैं. Blockly में पहले से मौजूद सीरियलाइज़र, ब्लॉक और वैरिएबल की जानकारी को सीरियलाइज़ करते हैं. हालांकि, अगर आपको किसी दूसरी जानकारी को सीरियलाइज़ करना है, तो आपको अपना सीरियलाइज़र जोड़ना होगा. उदाहरण के लिए, JSON सिस्टम डिफ़ॉल्ट रूप से, वर्कस्पेस-लेवल की टिप्पणियों को क्रम से नहीं लगाता. अगर आपको इन्हें क्रम से लगाना है, तो आपको एक और सीरियलाइज़र रजिस्टर करना होगा.

किसी प्लग इन की स्थिति को सीरियलाइज़ और डीसीरियलाइज़ करने के लिए, अक्सर अतिरिक्त सीरियलाइज़र का इस्तेमाल किया जाता है.

Blockly.serialization.registry.register(
    'workspace-comments',  // Name
    {
      save: saveFn,      // Save function
      load: loadFn,      // Load function
      clear: clearFn,    // Clear function
      priority: 10,      // Priority
    });

किसी सीरियलाइज़र को रजिस्टर करते समय, आपको कई चीज़ें देनी होंगी:

  • सीरियलाइज़र का नाम, जिसमें डेटा भी सेव होता है.
  • saveserialiser से जुड़े प्लग इन/सिस्टम की स्थिति का पता लगाने वाला फ़ंक्शन.
  • clear स्टेटस को बदलने वाला फ़ंक्शन.
  • load स्टेटस को बदलने वाला फ़ंक्शन.
  • priority, जिसका इस्तेमाल डेसीरियलाइज़ेशन के क्रम को तय करने के लिए किया जाता है.

    अपने सिरियलाइज़र की प्राथमिकता, पहले से मौजूद प्राथमिकताओं के आधार पर तय की जा सकती है

Blockly.serialization.workspaces.save को कॉल करने पर, हर सिरीलाइज़र का save फ़ंक्शन कॉल किया जाएगा. साथ ही, उसका डेटा फ़ाइनल JSON आउटपुट में जोड़ दिया जाएगा:

{
  "blocks": { ... },
  "workspaceComments": [ // Provided by workspace-comments serializer
    {
      "x": 239,
      "y": 31,
      "text": "Add 2 + 2"
    },
    // etc...
  ]
}

Blockly.serialization.workspaces.load को कॉल करने पर, हर सिरियलाइज़र को प्राथमिकता के क्रम में ट्रिगर किया जाता है. ज़्यादा प्राथमिकता वाली वैल्यू वाले सिरियलाइज़र, कम प्राथमिकता वाली वैल्यू वाले सिरियलाइज़र से पहले ट्रिगर होते हैं.

जब कोई सीरियलाइज़र ट्रिगर होता है, तो दो चीज़ें होती हैं:

  1. दिए गए clear फ़ंक्शन को कॉल किया जाता है. इससे यह पक्का होता है कि ज़्यादा स्टेटस लोड होने से पहले, आपके प्लग इन/सिस्टम का स्टेटस साफ़ हो. उदाहरण के लिए, workspace-comments serializer, वर्कस्पेस से सभी मौजूदा टिप्पणियां हटा देगा.
  2. दिए गए load फ़ंक्शन को कॉल किया जाता है.

एक्सएमएल सिस्टम

एक्सएमएल सिस्टम की मदद से, अपने वर्कस्पेस को एक्सएमएल नोड में सीरियलाइज़ किया जा सकता है. यह, Blockly का मूल सीरियलाइज़ेशन सिस्टम था. इसे अब आइसबॉक्स कर दिया गया है. इसका मतलब है कि इसमें नई सुविधाएं नहीं जोड़ी जाएंगी. इसलिए, हमारा सुझाव है कि अगर हो सके, तो JSON सिस्टम का इस्तेमाल करें.

API

एक्सएमएल सिस्टम के एपीआई के बारे में जानकारी के लिए, रेफ़रंस दस्तावेज़ देखें.

ब्लॉक हुक

ब्लॉक में अतिरिक्त सीरियलाइज़ेशन जोड़ने के तरीके के बारे में जानने के लिए, Mutators दस्तावेज़ देखें.

फ़ील्ड हुक

फ़ील्ड को क्रम से लगाने के तरीके के बारे में जानने के लिए, कस्टम फ़ील्ड दस्तावेज़ देखें.

JSON और XML में से किसी एक को चुनना

हमारा सुझाव है कि आप XML के बजाय, JSON सिरियलाइज़र का इस्तेमाल करें. JSON सिस्टम की मदद से, अपने वर्कस्पेस की स्थिति को JavaScript ऑब्जेक्ट में क्रम से लगाया जा सकता है. ऐसा करने के ये फ़ायदे हैं:

  1. JSON को आसानी से कंप्रेस किया जा सकता है या किसी दूसरे फ़ॉर्मैट में बदला जा सकता है.
  2. प्रोग्राम के हिसाब से JSON का इस्तेमाल करना आसान है.
  3. JSON में डेटा जोड़ना और उसे बड़ा करना आसान है.

इसके अलावा, एक्सएमएल सिस्टम को अब अपडेट नहीं मिलेंगे. साथ ही, इसमें JSON सिरियलाइज़र की तुलना में पहले से ही सुविधाएं मौजूद नहीं हैं. उदाहरण के लिए, अतिरिक्त डेटा को आसानी से सेव और लोड करने के लिए, अपना JSON सीरियलाइज़र रजिस्टर किया जा सकता है. जैसे, प्लग इन या आपके जोड़े गए कस्टमाइज़ेशन का डेटा. एक्सएमएल सिस्टम में ऐसा नहीं किया जा सकता.

अगर आपने पहले एक्सएमएल सीरियलाइज़ेशन का इस्तेमाल किया है, तो अपग्रेड करने के तरीके के बारे में जानने के लिए, माइग्रेशन गाइड देखें.