====== Analyse de la sérialisation Blockly — Comparaison avec les meilleures pratiques ====== ===== État actuel de l'implémentation ===== Toute la persistance workspace passe par **''UcBlocklyWorkspaceManager''** (''src/core/ucblockly_workspace_manager.ts''), avec l’aide de ''sanitizeSerializedWorkspaceState'' (''src/core/workspace_state.ts''). Le shell démo (''demo/blockly_application_shell.ts'') et le re-export ''blockly_application_type.ts'' délèguent à ce manager. === Session storage (''workspaceSaveBlocks'' / ''workspaceLoadBlocks'') === public workspaceSaveBlocks = (storageKeyWorkspaceBlocks: string): void => { const data = Blockly.serialization.workspaces.save(this.workspace); this.sanitizeSerializedWorkspaceState(data); window.sessionStorage?.setItem(storageKeyWorkspaceBlocks, JSON.stringify(data)); }; public workspaceLoadBlocks = (storageKeyWorkspaceBlocks: string): void => { const data = window.sessionStorage?.getItem(storageKeyWorkspaceBlocks); if (!data) return; try { const parsed = JSON.parse(data); if (typeof parsed !== 'object' || parsed === null) { console.warn('Invalid workspace data format, skipping load'); return; } this.sanitizeSerializedWorkspaceState(parsed); // clear + load + normalizeVariableTypes + refreshBoardPinDropdowns } catch (error) { console.error('Failed to load workspace blocks:', error); window.sessionStorage?.removeItem(storageKeyWorkspaceBlocks); } }; === Fichiers (''workspaceSaveToFile'' / ''workspaceLoadFromFile'') === * Export JSON téléchargeable via l’API officielle Blockly. * Import avec validation, gestion d’erreurs utilisateur (''alert''), mode **fusion** (''mergeBlocksFromState'') ou remplacement complet. * ''sanitizeSerializedWorkspaceState'' normalise l’état avant chargement. === Points positifs ✅ === - **API JSON officielle** : ''Blockly.serialization.workspaces.save()'' / ''load()'' - **Sauvegarde automatique** : debounce (''scheduleSave()'') sur les changements du workspace - **Sauvegarde à la fermeture** : ''onbeforeunload'' - **Charge au démarrage** : restauration depuis sessionStorage - **Robustesse** : ''try/catch'', validation objet, suppression des données corrompues - **Post-traitement** : ''normalizeVariableTypes()'', ''refreshBoardPinDropdowns()'' - **Ancien ''serialization.ts''** : fichier supprimé ; plus de code parallèle obsolète ===== Comparaison avec les meilleures pratiques Blockly ===== Selon la [[https://developers.google.com/blockly/guides/configure/web/serialization|documentation officielle Blockly]] : ^ Critère ^ Statut ^ | Format JSON (XML legacy évité) | ✅ | | API ''Blockly.serialization.workspaces'' | ✅ | | État complet (blocs, variables, plugins) | ✅ | | Timing (changements + déchargement page) | ✅ | | Gestion d’erreurs au chargement | ✅ (session + fichier) | ===== Améliorations encore possibles (optionnel) ===== === Version explicite du format exporté === Pour faciliter les migrations futures, on pourrait encapsuler : { version: 1, data: Blockly.serialization.workspaces.save(workspace) } Non implémenté aujourd’hui : le JSON reste le format Blockly natif, compatible avec les outils tiers (dont ''convert-rduino''). === Validation typée plus stricte === Une garde ''isValidWorkspaceData(data)'' (présence de ''blocks'' ou ''variables'') pourrait compléter la validation actuelle ''typeof object''. ===== Conversion Blockly@rduino ===== Les projets XML Blockly@rduino ne passent pas par cette sérialisation : utiliser **''npm run convert-rduino''** → voir [[fr:arduino:ucblockly:convert_rduino|CONVERT_RDUINO.md]]. ===== Conclusion ===== L’implémentation actuelle est **alignée sur les recommandations Blockly** et inclut déjà la plupart des améliorations suggérées dans les versions antérieures de ce document (erreurs, validation basique, suppression de ''serialization.ts''). --- ===== Voir aussi ===== * [[fr:arduino:ucblockly:architecture|ARCHITECTURE.md]] — flux de démarrage et persistance du workspace ; * [[fr:arduino:ucblockly:convert_rduino|CONVERT_RDUINO.md]] — import de sauvegardes Blockly@rduino ; * [[fr:arduino:ucblockly:integration|INTEGRATION_DEPOT.md]] — intégration du dépôt dans un autre projet.