क्रम से लगाना

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

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

JSON सिस्टम

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

सेव और लोड किया जा रहा है

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

workspaces नेमस्पेस पर save और load तरीकों को कॉल करके, पूरे वर्कस्पेस की स्थिति को सीरीज़ के तौर पर सेट किया जा सकता है या उसके क्रम को बदला जा सकता है.

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

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

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

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

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

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

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

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

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

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

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

हुक ब्लॉक करें

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

फ़ील्ड हुक

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

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

JSON सिस्टम आपको ऐसे सीरियलाइज़र रजिस्टर करने की अनुमति देता है जो किसी स्टेट को क्रम से लगाते हैं और डीसीरियलाइज़ करते हैं. ब्लॉकली के बिल्ट-इन सीरियलाइज़र ब्लॉक और वैरिएबल के बारे में जानकारी को क्रम से लगाने का काम करते हैं, लेकिन अगर आपको अन्य जानकारी को सीरियलाइज़ करना है, तो आपको अपना सीरियलाइज़र जोड़ना होगा. उदाहरण के लिए, 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 फ़ंक्शन को कॉल किया गया है. इससे यह पक्का होता है कि ज़्यादा स्टेटस लोड होने से पहले, आपके प्लगिन/सिस्टम की स्थिति ठीक है. उदाहरण के लिए, वर्कस्पेस-कमेंट सीरियलाइज़र, वर्कस्पेस से सभी मौजूदा टिप्पणियों को हटा देगा.
  2. दिए गए load फ़ंक्शन को कॉल किया गया है.

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

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

API

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

हुक ब्लॉक करें

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

फ़ील्ड हुक

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

JSON और एक्सएमएल के बीच चुनना

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

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

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

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