סידור של

שרשור הוא שמירת המצב של סביבת העבודה כדי שניתן יהיה לטעון אותו חזרה לסביבת העבודה מאוחר יותר. זה כולל סריאליזציה של המצב של כל הבלוקים, המשתנים או הפלאגינים שרוצים לשמור. אפשר להמיר את כל הנתונים שצריך לשמור לפורמט מבוסס-טקסט כדי שיהיה קל לאחסן אותם, ולאחר מכן לטעון אותם חזרה לסביבת עבודה פעילה באופן מלא.

ב-Blockly יש שני פורמטים לנתונים האלה: JSON ו-XML. מומלץ להשתמש במערכת JSON בפרויקטים חדשים, ולעודד פרויקטים ישנים יותר שמשתמשים ב-XML לשדרג. מערכת ה-XML היא פורמט השמירה הקודם. הוא לא יוסר, אבל לא יקבל תכונות חדשות.

מערכת JSON

מערכת ה-JSON serialization מורכבת מכמה סריאליזטורים. יש מכשירים סידוריים מובנים לבלוקים ולמשתנים, ואפשר גם לרשום מכשירים סידוריים נוספים. כל סריאליזטור אחראי לסריאליזציה ולדה-סריאליזציה של המצב של פלאגין או מערכת מסוימים.

שמירה וטעינה

סביבות עבודה

אפשר לבצע סריאליזציה או דה-סריאליזציה של המצב של סביבת עבודה שלמה על ידי קריאה לשיטות save ו-load במרחב השמות workspaces.

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

הקריאות האלה מבצעות סריאליזציה או דה-סריאליזציה של כל המערכות הנפרדות (שמיוצגות על ידי סריאליזטורים) שרשומים בסביבת העבודה.

בלוקים נפרדים

אפשר לבצע סריאליזציה או דה-סריאליזציה של בלוקים ספציפיים על ידי קריאה לשיטות save ו-append במרחב השמות blocks.

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, למסנני ה-JSON ניתנת סטטוס כדי לבצע דה-סריאליזציה לפי עדיפות. הסבר נוסף מופיע בקטע סריאליזציה, והמטרה שלו היא לאפשר לסריאליזציה להסתמך על מצב ממערכות אחרות.

הסדר של ביטול הסריאליזציה של סריאליזטורים מובְנים הוא:

  1. מודלים של משתנים עוברים סריאליזציה.
  2. מודלים של פרוצדורות עוברים דה-סריאליזציה.
  3. הבלוקים עוברים סריאליזציה. בלוקים בודדים ברמה העליונה עוברים תהליך deseriding בסדר שרירותי.
    1. הסוג עובר סריקה מחדש (deserialization). הפונקציה הזו יוצרת את הבלוק, מפעילה את שיטת ה-init שלו ומערבבת את התוספים.
    2. המאפיינים עוברים סריאליזציה חוזרת. המאפיינים האלה כוללים מאפיינים שיכולים לחול על כל בלוק. לדוגמה: x,‏ y,‏ collapsed,‏ disabled ו-data.
    3. מצב נוסף עבר תהליך deserialize. מידע נוסף זמין במשאבי העזרה בנושא תוספים ומוטטורים.
    4. הבלוק מחובר לרכיב ההורה שלו (אם יש כזה).
    5. הסמלים עוברים סריאליזציה. הסמלים הבודדים עוברים סריאליזציה מחדש בסדר שרירותי.
    6. השדות עוברים סריאליזציה לאחור. שדות נפרדים עוברים סריליזציה בסדר שרירותי.
    7. בלוקים של קלט עוברים סריאליזציה. הרשימה הזו כוללת בלוקים שמחוברים לקלטים של ערכים ולקלטים של הצהרות. הקלט היחיד מומר ל-JSON בסדר שרירותי.
    8. הבלוקים הבאים עוברים תהליך deserialize.

מתי לשמור מצב נוסף

בבלוקים, אם יש משהו נמוך יותר בסדר שתלוי במשהו גבוה יותר בסדר, צריך לשכפל את הנתונים ולהוסיף אותם למצב הנוסף.

לדוגמה, אם יש שדה שקיים רק אם הבלוק הבא מחובר, צריך להוסיף מידע על הבלוק הבא למצב הנוסף, כדי שאפשר יהיה להוסיף את השדה לבלוק לפני ביצוע פעולת deserialize של מצב השדה.

עם זאת, אם יש קלט שקיים רק אם בשדה יש ערך מסוים, לא צריך להוסיף מידע על השדה למצב הנוסף. הסיבה לכך היא שהמצב של השדה יתבצע קודם בסריאליזציה, ואז תוכלו להוסיף את הקלט לבלוק. בדרך כלל, הוספת הקלט מופעלת על ידי מאמת.

חשוב לזכור שבכלל לגבי כפילויות של מצב צריך גם להביא בחשבון שערמות של בלוקים, סמלים, שדות ובלוקים של קלט עוברים סריאליזציה מחדש בסדר שרירותי. לדוגמה, אם יש לכם שדה אחד, B, שקיים רק אם לשדה אחר, A, יש ערך מסוים, עליכם להוסיף מידע על A למצב הנוסף למקרה ש-B עבר סריקה מחדש לפני A.

קטעי הוק (hooks) לחסימה

למידע נוסף על הוספת סריאליזציה נוספת לבלוק, תוכלו לעיין במסמכי העזרה בנושא תוספים ומטא-מודיפיקציות.

קטעי הוק (hooks) לשדות

מידע נוסף על סריאליזציה של שדות זמין במסמכי העזרה בנושא שדות מותאמים אישית.

קטעי הוק לסריאליזציה

מערכת ה-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 המצב של הפלאגין או המערכת שמשויכים ל-Serializer.
  • פונקציה לclear המצב.
  • פונקציה לload של המצב.
  • priority, שמשמשים לקביעת סדר ה-deserialization.

    אפשר להגדיר את העדיפות של הסריאליזטור על סמך העדיפויות המובנות

כשפונקציית 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 יסיר את כל התגובות הקיימות מ-workspace.
  2. הפונקציה load שסופקה נקראת.

מערכת XML

מערכת ה-XML מאפשרת לסדר את סביבת העבודה בצורה רציפה בצומת XML. זו הייתה מערכת הסריאליזציה המקורית של Blockly. הוא הועבר למצב 'המתנה', כלומר לא יתווספו לו תכונות חדשות. לכן, מומלץ להשתמש במערכת JSON אם אפשר.

ממשקי API

מידע על ממשקי ה-API של מערכת ה-XML זמין במסמכי העזרה.

קטעי הוק (hooks) לחסימה

למידע נוסף על הוספת עוד סריאליזציה לבלוקים, עיינו במסמכי העזרה של תוספים ומוטטורים.

קטעי הוק (hooks) לשדות

במסמכי העזרה של שדות בהתאמה אישית מוסבר איך עורכים שדות.

בחירה בין JSON ל-XML

אנחנו ממליצים להשתמש בסריאליזציה של JSON במקום ב-XML. מערכת ה-JSON מאפשרת לסריאליזציה של המצב של סביבת העבודה באובייקט JavaScript. זה מועיל כי:

  1. קל לדחוס או להמיר קובצי JSON לפורמט אחר.
  2. קל לעבוד עם JSON באופן פרוגרמטי.
  3. קל להרחיב ולצרף נתונים בפורמט JSON.

בנוסף, מערכת ה-XML לא תקבל יותר עדכונים, והיא כבר חסרה תכונות בהשוואה לסריאליזטור של JSON. לדוגמה, תוכלו לרשום כלי סידורי משלכם בפורמט JSON כדי לשמור ולטעון בקלות נתונים נוספים, כמו נתונים של יישומי פלאגין או התאמות אישיות שהוספתם. אי אפשר לעשות זאת במערכת XML.

אם השתמשתם בעבר בסריאליזציה של XML, תוכלו למצוא מידע על השדרוג במדריך להעברת נתונים (מיגרציה).