क्रम से लगाना

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

Blockly इस डेटा के लिए दो फ़ॉर्मैट उपलब्ध कराता है: JSON और एक्सएमएल. हमारा सुझाव है कि नए प्रोजेक्ट के लिए, 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, छोटा किया गया, बंद है, और डेटा.
    3. अतिरिक्त स्थिति को डीसीरियलाइज़ (पार्स) किया जाता है. ज़्यादा जानकारी के लिए, एक्सटेंशन और ट्रांसफ़ॉर्मर दस्तावेज़ देखें.
    4. ब्लॉक, अपने पैरंट से कनेक्ट हो (अगर कोई पैरंट मौजूद हो).
    5. आइकॉन को डीसीरियलाइज़ (पार्स) किया जाता है. अलग-अलग आइकॉन को किसी भी क्रम में डेसिरियलाइज़ किया जाता है.
    6. फ़ील्ड को डिसीरियलाइज़ किया जाता है. अलग-अलग फ़ील्ड को आर्बिट्ररी ऑर्डर में डीसीरियलाइज़ (पार्स) किया जाता है.
    7. इनपुट ब्लॉक डीसीरियलाइज़ (पार्स) होते हैं. इसमें वैल्यू इनपुट और स्टेटमेंट इनपुट से जुड़े ब्लॉक शामिल हैं. अलग-अलग इनपुट को किसी भी क्रम में, डिससिरियलाइज़ किया जाता है.
    8. अगले ब्लॉक को डिसीरियलाइज़ किया जाता है.

अतिरिक्त स्टेट कब सेव करें

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

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

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

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

ब्लॉक हुक

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

फ़ील्ड हुक

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

सीरियलाइज़र हुक

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

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

  • सीरियलाइज़र का नाम, जिससे डेटा भी सेव होता है.
  • सीरियलाइज़र से जुड़े प्लगिन/सिस्टम की स्थिति को save करने के लिए एक फ़ंक्शन.
  • राज्य को 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

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

ब्लॉक हुक

ब्लॉक को अलग से क्रम में लगाने का तरीका जानने के लिए, एक्सटेंशन और म्यूटर दस्तावेज़ देखें.

फ़ील्ड हुक

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

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

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

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

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

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