La serializzazione consente di salvare lo stato dell'area di lavoro in modo da poterlo caricare nuovamente in un secondo momento. Sono incluse la serializzazione dello stato di eventuali blocchi, variabili o plug-in che vuoi salvare. Puoi convertire tutti i dati da salvare in un formato basato su testo per archiviarli facilmente, per poi caricarli nuovamente in un'area di lavoro completamente funzionale in un secondo momento.
Blockly fornisce due formati per questi dati: JSON e XML. Consigliamo di utilizzare il sistema JSON per i nuovi progetti e invitiamo i progetti precedenti che utilizzano XML a eseguire l'upgrade. Il sistema XML è il formato di salvataggio precedente. Non verrà rimosso, ma non riceverà nuove funzionalità.
Sistema JSON
Il sistema di serializzazione JSON è costituito da più serializzatori. Esistono metodi di serializzazione integrati per blocchi e variabili e puoi anche registrare metodi di serializzazione aggiuntivi. Ogni serializzatore è responsabile della serializzazione e della deserializzazione dello stato di un determinato plug-in o sistema.
Salvataggio e caricamento
Aree di lavoro
Puoi serializzare o deserializzare lo stato di un'intera area di lavoro chiamando i metodi save
e load
nello spazio dei nomi workspaces
.
const state = Blockly.serialization.workspaces.save(myWorkspace);
Blockly.serialization.workspaces.load(state, myWorkspace);
Queste chiamate eseguono la serializzazione o la deserializzazione di tutti i singoli sistemi (rappresentati da serializzatori) registrati nello spazio di lavoro.
Blocchi singoli
Puoi serializzare o deserializzare singoli blocchi chiamando i metodi save
e
append
nello spazio dei nomi blocks
.
const blockJson = Blockly.serialization.blocks.save(myBlock);
const duplicateBlock =
Blockly.serialization.blocks.append(blockJson, myWorkspace);
Impianti individuali
Puoi serializzare o deserializzare singoli sistemi (ad es. blocchi, variabili, plug-in e così via) creando il serializzatore associato e chiamando i relativi metodi save
e 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);
Ordine di deserializzazione
Il sistema JSON ha un ordine di deserializzazione esplicito, che semplifica la prevenzione della duplicazione dello stato all'interno di un salvataggio.
Quando viene chiamato Blockly.serialization.workspaces.load
, ai serializzatori viene fornito lo stato da deserializzare in ordine di priorità. Questo aspetto è spiegato più dettagliatamente nella sezione Serializzatori e il suo scopo è consentire ai serializzatori di dipendere dallo stato di altri sistemi.
L'ordine di deserializzazione dei serializzatori integrati è:
- I modelli di variabili vengono deserializzati.
- I modelli di procedure vengono deserializzati.
- I blocchi vengono deserializzati. I singoli blocchi di primo livello vengono
deserializzati in un ordine arbitrario.
- Il tipo è deserializzato. Questo costruisce il blocco, attiva il suo metodo init e mescola le estensioni.
- Gli attributi vengono deserializzati. Sono incluse le proprietà che possono essere applicate a qualsiasi blocco. Ad esempio: x, y, collapsed, disabled e data.
- Lo stato extra viene deserializzato. Per ulteriori informazioni, consulta la documentazione relativa a Estensioni e mutatori.
- Il blocco è collegato al blocco principale (se esistente).
- Le icone vengono deserializzate. Le singole icone vengono deserializzate in un ordine arbitrario.
- I campi vengono deserializzati. I singoli campi vengono deserializzati in un ordine arbitrario.
- I blocchi di input sono deserializzati. Sono inclusi i blocchi collegati ai valori di input e agli input di istruzioni. I singoli input vengono deserializzati in un ordine arbitrario.
- I blocchi successivi vengono deserializzati.
Quando salvare uno stato aggiuntivo
Per i blocchi, se hai qualcosa di più basso nell'ordine che dipende da qualcosa di più alto nell'ordine, devi duplicare i dati e aggiungerli allo stato extra.
Ad esempio, se hai un campo che esiste solo se è collegato un blocco successivo, devi aggiungere informazioni su questo blocco successivo allo stato aggiuntivo, in modo che il campo possa essere aggiunto al blocco prima che lo stato del campo venga deserializzato.
Tuttavia, se hai un input che esiste solo se un campo ha un determinato valore, non è necessario aggiungere informazioni sul campo allo stato aggiuntivo. Questo accade perché lo stato del campo verrà deserializzato per primo e, quando ciò avviene, puoi aggiungere l'input al blocco. In genere, l'aggiunta dell'input viene attivata da un convalidatore.
Tieni presente che la regola relativa alla duplicazione dello stato deve tenere conto anche del fatto che le serie di blocchi, le icone, i campi e i blocchi di input vengono deserializzati in un ordine arbitrario. Ad esempio, se hai un campo B che esiste solo se un altro campo A ha un determinato valore, devi aggiungere informazioni su A allo stato aggiuntivo nel caso in cui B viene deserializzato prima di A.
Hook di blocco
Per informazioni su come aggiungere un'ulteriore serializzazione ai blocchi, consulta la documentazione su Estensioni e mutatori.
Ganci da campo
Per informazioni su come serializzare i campi, consulta la documentazione relativa ai campi personalizzati.
Hook di serializzazione
Il sistema JSON consente di registrare i serializzatori che eseguono la serializzazione e la deserializzazione di alcuni stati. I serializzatori integrati di Blockly si occupano di serializzare informazioni su blocchi e variabili, ma se vuoi serializzare altre informazioni dovrai aggiungere il tuo serializzatore. Ad esempio, i commenti a livello di area di lavoro non sono serializzati per impostazione predefinita dal sistema JSON. Se vuoi serializzarli, dovrai registrare un serializzatore aggiuntivo.
Spesso vengono utilizzati altri serializzatori per serializzare e deserializzare lo stato di un plug-in.
Blockly.serialization.registry.register(
'workspace-comments', // Name
{
save: saveFn, // Save function
load: loadFn, // Load function
clear: clearFn, // Clear function
priority: 10, // Priority
});
Quando registri un serializzatore, devi fornire diversi elementi:
- Un nome per il serializzatore, sotto il quale vengono salvati anche i dati.
- Una funzione per
save
lo stato del plug-in/sistema associato al serializzatore. - Una funzione per
clear
lo stato. - Una funzione per
load
lo stato. Un
priority
, utilizzato per determinare l'ordine di deserializzazione.Puoi basare la priorità del serializzatore sulle priorità predefinite
Quando viene chiamato Blockly.serialization.workspaces.save
, viene chiamata la funzione save
di ogni serializzatore e i relativi dati vengono aggiunti all'output JSON finale:
{
"blocks": { ... },
"workspaceComments": [ // Provided by workspace-comments serializer
{
"x": 239,
"y": 31,
"text": "Add 2 + 2"
},
// etc...
]
}
Quando viene chiamato Blockly.serialization.workspaces.load
, ogni serializzatore viene attivato in ordine di priorità. I serializzatori con valori di priorità più positivi vengono attivati prima di quelli con valori di priorità meno positivi.
Quando viene attivato un serializzatore, si verificano due cose:
- Viene chiamata la funzione
clear
fornita. Ciò garantisce che lo stato del plug-in/sistema sia pulito prima che vengano caricati altri stati. Ad esempio, il serializzatore workspace-comments rimuoverà tutti i commenti esistenti dallo spazio di lavoro. - È stata chiamata la funzione
load
specificata.
Sistema XML
Il sistema XML ti consente di serializzare lo spazio di lavoro in un nodo XML. Questo era il sistema di serializzazione originale di Blockly. Ora è in stato inattivo, il che significa che non riceverà nuove funzionalità. Di conseguenza, ti consigliamo di utilizzare il sistema JSON, se possibile.
API
Per informazioni sulle API del sistema XML, consulta la documentazione di riferimento.
Hook di blocco
Per informazioni su come aggiungere una serializzazione aggiuntiva ai blocchi, consulta la documentazione su Estensioni e mutatori.
Ganci da campo
Per informazioni su come serializzare i campi, consulta la documentazione sui campi personalizzati.
Scelta tra JSON e XML
Consigliamo di utilizzare il serializzatore JSON anziché XML. Il sistema JSON ti consente di eseguire la serializzazione dello stato della tua area di lavoro in un oggetto JavaScript. Questo è vantaggioso perché:
- JSON è facile da comprimere o convertire in un altro formato.
- JSON è facile da utilizzare in modo programmatico.
- È facile estendere e aggiungere dati a JSON.
Inoltre, il sistema XML non riceverà più aggiornamenti e manca già di funzionalità rispetto al serializzatore JSON. Ad esempio, puoi registrare il tuo serializzatore JSON per salvare e caricare facilmente altri dati, come i dati dei plug-in o le personalizzazioni che hai aggiunto. Questa operazione non è possibile nel sistema XML.
Se hai già utilizzato la serializzazione XML, consulta la guida alla migrazione per informazioni su come eseguire l'upgrade.