La serialización guarda el estado de tu espacio de trabajo para que se pueda volver a cargar más adelante. Esto incluye serializar el estado de cualquier bloque, variable o complemento que desees guardar. Puedes convertir todos los datos que necesites guardar en un formato basado en texto para un almacenamiento fácil y, luego, volver a cargarlos en un lugar de trabajo completamente funcional más adelante.
Blockly proporciona dos formatos para estos datos: JSON y XML. Recomendamos usar el sistema JSON para los proyectos nuevos y recomendamos que los proyectos más antiguos que usan XML se actualicen. El sistema XML es el formato de guardado heredado. No se quitará, pero no recibirá funciones nuevas.
Sistema JSON
El sistema de serialización JSON consta de varios serializadores. Hay serializadores integrados para bloques y variables, y también puedes registrar serializadores adicionales. Cada serializador es responsable de serializar y deserializar el estado de un complemento o sistema en particular.
Guardado y carga
Lugares de trabajo
Puedes serializar o deserializar el estado de un lugar de trabajo completo llamando a los métodos save
y load
en el espacio de nombres workspaces
.
const state = Blockly.serialization.workspaces.save(myWorkspace);
Blockly.serialization.workspaces.load(state, myWorkspace);
Estas llamadas serializan o deserializan todos los sistemas individuales (representados por serializadores) que están registrados en el espacio de trabajo.
Bloques individuales
Para serializar o deserializar bloques individuales, llama a los métodos save
y append
en el espacio de nombres blocks
.
const blockJson = Blockly.serialization.blocks.save(myBlock);
const duplicateBlock =
Blockly.serialization.blocks.append(blockJson, myWorkspace);
Sistemas individuales
Puedes serializar o deserializar sistemas individuales (p. ej., bloques, variables, complementos, etc.) si construyes el serializador asociado y llamas a sus métodos save
y 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);
Orden de deserialización
El sistema JSON tiene un orden de deserialización explícito, que facilita la prevención de la duplicación del estado dentro de un guardado.
Cuando se llama a Blockly.serialization.workspaces.load
, a los serializadores se les asigna un estado para deserializar en orden de prioridad. Esto se explica con más detalle en la sección Serializadores, y su propósito es permitir que los serializadores dependan del estado de otros sistemas.
El orden de deserialización de serializadores integrados es el siguiente:
- Los modelos de variables se deserializan.
- Los modelos de procedimiento se deserializan.
- Los bloques se deserializan. Los bloques individuales de nivel superior se desserializan en un orden arbitrario.
- Se deserializa el tipo. Esto construye el bloque, activa su método de inicialización y combina las extensiones.
- Los atributos se deserializan. Esto incluye las propiedades que se pueden aplicar a cualquier bloque. Por ejemplo: x, y, colapsado, inhabilitado y datos.
- Se deserializa el estado adicional. Consulta la documentación sobre Extensiones y mutadores para obtener más información.
- El bloque está conectado a su elemento superior (si existe uno).
- Los íconos se deserializan. Los íconos individuales se deserializan en un orden arbitrario.
- Los campos se deserializan. Los campos individuales se deserializan en un orden arbitrario.
- Se deserializan los bloques de entrada. Esto incluye bloques conectados a entradas de valor y entradas de sentencia. Las entradas individuales se deserializan en un orden arbitrario.
- Los siguientes bloques se deserializan.
Cuándo guardar estados adicionales
En el caso de los bloques, si tienes algo más bajo en el orden que depende de algo más alto en el orden, debes duplicar esos datos y agregarlos a tu estado adicional.
Por ejemplo, si tienes un campo que solo existe si el siguiente bloque está conectado, debes agregar información sobre ese bloque a tu estado adicional, de modo que el campo se pueda agregar a tu bloque antes de que el estado del campo se deserialice.
Sin embargo, si tienes una entrada que solo existe si un campo tiene un valor determinado, no es necesario que agregues información sobre el campo a tu estado adicional. Esto se debe a que el estado de tu campo se deserializará primero y, cuando sea así, podrás agregar la entrada a tu bloque. Por lo general, agregar la entrada se activará con un validador.
Ten en cuenta que la regla sobre el estado de duplicación también debe tener en cuenta que las pilas de bloques, los íconos, los campos y los bloques de entrada se deserializan en un orden arbitrario. Por ejemplo, si tienes un campo B que solo existe si otro campo A tiene un valor determinado, debes agregar información sobre A a tu estado adicional en caso de que B se deserialice antes que A.
Hooks de bloqueo
Para obtener información sobre cómo agregar serialización adicional a los bloques, consulta la documentación Extensiones y mutadores.
Hooks de campo
Para obtener información sobre cómo serializar campos, consulta la documentación Campos personalizados.
Hooks de serializador
El sistema JSON te permite registrar serializadores que serializan y deserializan algunos estados. Los serializadores integrados de Blockly se encargan de serializar información sobre bloques y variables, pero si quieres serializar otra información, deberás agregar tu propio serializador. Por ejemplo, el sistema JSON no serializa los comentarios a nivel del lugar de trabajo de forma predeterminada. Si quieres serializarlos, deberás registrar un serializador adicional.
A menudo, se usan serializadores adicionales para serializar y deserializar el estado de un complemento.
Blockly.serialization.registry.register(
'workspace-comments', // Name
{
save: saveFn, // Save function
load: loadFn, // Load function
clear: clearFn, // Clear function
priority: 10, // Priority
});
Cuando registras un serializador, debes proporcionar varios elementos:
- Un nombre para el serializador, en el que también se guardan los datos.
- Una función para
save
el estado del complemento o sistema asociado con el serializador. - Una función para
clear
el estado. - Una función para
load
el estado. Un
priority
, que se usa para determinar el orden de deserialización.Puedes basar la prioridad de tu serializador en las prioridades integradas.
Cuando se llame a Blockly.serialization.workspaces.save
, se llamará a la función save
de cada serializador y sus datos se agregarán al resultado JSON final:
{
"blocks": { ... },
"workspaceComments": [ // Provided by workspace-comments serializer
{
"x": 239,
"y": 31,
"text": "Add 2 + 2"
},
// etc...
]
}
Cuando se llama a Blockly.serialization.workspaces.load
, cada serializador se activa en orden de prioridad. Los serializadores con valores de prioridad más positivos se activan antes que los serializadores con valores de prioridad menos positivos.
Cuando se activa un serializador, suceden dos cosas:
- Se llama a la función
clear
proporcionada. Esto garantiza que el estado de tu plugin o sistema esté limpio antes de que se cargue más estado. Por ejemplo, el serializador de comentarios de Workspace quitaría todos los comentarios existentes del espacio de trabajo. - Se llama a la función
load
proporcionada.
Sistema XML
El sistema XML te permite serializar tu espacio de trabajo en un nodo XML. Este era el sistema de serialización original de Blockly. Ahora está en la lista de espera, lo que significa que no recibirá funciones nuevas. Por lo tanto, te recomendamos que uses el sistema JSON si es posible.
API
Para obtener información sobre las APIs del sistema XML, consulta la documentación de referencia.
Hooks de bloqueo
Si deseas obtener información para agregar serialización adicional a los bloques, consulta la documentación de Extensiones y mutadores.
Hooks de campo
Para obtener información sobre cómo serializar campos, consulta la documentación de Campos personalizados.
Elige entre JSON y XML
Recomendamos el serializador JSON en lugar del XML. El sistema JSON te permite serializar el estado de tu espacio de trabajo en un objeto JavaScript. Esto es ventajoso por los siguientes motivos:
- JSON es fácil de comprimir o convertir a otro formato.
- Es fácil trabajar con JSON de forma programática.
- JSON es fácil de extender y agregar datos.
Además, el sistema XML ya no recibirá actualizaciones y ya carece de funciones en comparación con el serializador JSON. Por ejemplo, puedes registrar tu propio serializador de JSON para guardar y cargar datos adicionales con facilidad, como los datos de los complementos o las personalizaciones que agregaste. Esto no es posible en el sistema XML.
Si ya usaste la serialización XML, consulta la guía de migración para obtener información sobre cómo actualizar.