Sérialisation de données

Dans ce TP vous allez coder un algorithme de sérialisation. Comme pour les précédents TPs, vous avez le choix entre Java et Python. De manière générale nous allons sérialiser les modèles en JSON selon un schéma de votre choix. Regardez comment produire et lire du JSON en Java. En Python, tout est intégré dans la bibliothèque standard, mais en Java, il faudra que vous utilisiez une bibliothèque externe. En Java, il existe plusieurs bibliothèques, mais on vous conseille d’utiliser org.json qui est simple à prendre en main.

Vous pouvez trouvez au dessous comment paramétrer votre projet Java et Python correctement avec quelques exemples de code de comment utiliser les bibliothèques en Java et Python voici quelques liens :

Créer/paramétrer son projet Java

Le paramétrage du projet en Java n’est pas compliqué en soit, mais il peut-être long si vous ne savez pas vraiment où aller. Ici, vous trouverez un mini-tuto pour paramétrer correctement votre projet. Si vous rencontrez trop de difficultés avec le paramétrage de votre projet, n’hésitez pas à demander ou à passer en Python. Pour init votre projet, il va falloire faire deux choses imporantes :

  1. installer les composants maven pour Eclipse (pas nécessaire si vous les avez déjà),

  2. bien créer votre pom.xml.

Installation des composants maven pour Eclipse

Allez dans Help→Install new software…​, dans la partie combo-box Work with, sélectionnez 2021-06…​ (ou tout autre date que vous avez, mais sélectionnez la plus récente des entrées avec une date). Ensuite, dans le champ type filter text, cherchez maven, puis sélectionnez à installer :

  • m2e - Maven Integration for Eclipse

  • m2e connector for mavenarchiver pom properties

Cliquez ensuite sur Finish et poursuivez l’installation. Une fois l’installation terminée, redémarrez votre Eclipse.

Création du projet pour le TP

Il faut maintenant créer un projet Eclipse-Maven et bien le paramétrer. Créez un projet avec File→new→Other→Maven project. Sur la page de création du projet Maven, sélectionnez create a simple project (skip archetype selection). Sur la page suivante, entrez les informations suivantes pour la création du projet Maven :

  • Group ID: org.univ.metamodeling

  • Artifact ID: serializer

Une fois le projet créé, ouvrez le fichier pom.xml et utilisez les dépendances suivantes :

<dependencies>
  <dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20210307</version>
  </dependency>
  <dependency>
    <groupId>org.eclipse.emf</groupId>
    <artifactId>org.eclipse.emf.ecore</artifactId>
    <version>2.25.0</version>
  </dependency>
  <dependency>
    <groupId>org.eclipse.emf</groupId>
    <artifactId>org.eclipse.emf.ecore.xmi</artifactId>
    <version>2.16.0</version>
  </dependency>
</dependencies>
Important
Si vous avez des erreurs sur votre projet, il y a de fortes chances que ça soit des erreurs Maven. Pour les résoudre, faites un clic droit sur votre projet, puis sélectionnez Maven→Update project tout en cochant Force Update of Snapshot Releases.

Utiliser la bibliothèque org.json

La bibliothèque est plutôt simple à utiliser, on créer des JSONObject et/ou JSONArray qui sont l’équivalent soit de map, soit de collection dans lesquels on rajoute les informations dont on a besoin. Voici un exemple de comment créer un objet et un array JSON et de comment les "dumps" en chaine de caractère :

JSONObject obj = new JSONObject()
                .put("JSON1", "Hello World!")
                .put("JSON2", "Hello my World!")
                .put("JSON3", 44);
JSONArray array = new JSONArray().put(obj);

System.out.println(array.toString());

Testez votre code

Pour tester votre projet, il est plus simple de prendre directement des méta-modèles que vous avez déjà produit. Normalement votre code est censé fonctionner avec n’importe quel type d’éléments, méta-modèle ou modèles, il est donc facile d’ouvrir un de vos modèles ou méta-modèles et de voir si tout fonctionne :

ResourceSet rset = new ResourceSetImpl();
rset.getResourceFactoryRegistry().getExtensionToFactoryMap().put("ecore", new XMIResourceFactoryImpl());
rset.getResourceFactoryRegistry().getExtensionToFactoryMap().put("xmi", new XMIResourceFactoryImpl());

// Enregistrez ici vos méta-modèles si nécessaire
//	rset.getPackageRegistry().put(YOUR_MM_URI, YOUR_MM_EPACKAGE)

Resource r = rset.getResource(URI.createFileURI(PATH_TO_YOUR_ECORE_OR_XMI_MODEL), true);
EObject root = r.getContents().get(0);

// Ici l'appel à votre code pour la sérialisation

Créer/paramétrer son projet Python

Si vous avez déjà travaillé en Python, il n’y a pas de manipulation spéciale à faire si ce n’est l’activation de votre env. virtuel. Si vous n’avez encore jamais travaillé avec Python, il est nécessaire de travailler avec un env. virtuel. Regardez sur le TP 2 comment les choses étaient faites.

Utiliser la bibliothèque intégrée pour la gestion du JSON

Python propose directement une bibliothèque pour la création d’objets JSON. La bibliothèque travaille avec des objets Python de base (dictionnaire pour les objets et liste pour les arrays JSON). Le petit morceau de code suivant vous montre comment créer un objet et un array JSON.

import json

obj = {
  'JSON1': 'Hello World!',
  'JSON3': 44,
}
obj['JSON2'] = 'Hello my World!'
array = []
array.append(obj)
# ou directement array = [obj]

jsonstring = json.dumps(array)
print(jsonstring)

Testez votre code

Pour tester votre projet, il est plus simple de prendre directement des méta-modèles que vous avez déjà produit. Normalement votre code est censé fonctionner avec n’importe quel type d’éléments, méta-modèle ou modèles, il est donc facile d’ouvrir un de vos modèles ou méta-modèles et de voir si tout fonctionne :

from pyecore.resources import ResourceSet

rset = ResourceSet()
# Enregistrez ici vos méta-modèles si nécessaire
#  rset.metamodel_registry[YOUR_MM_URI] = YOUR_MM_EPACKAGE

resource = rset.get_resource(PATH_TO_YOUR_ECORE_OR_XMI_MODEL)
root = resource.contents[0]
Associate professor in Computer Sciences

My research interests include language engineering, virtual machine and software engineering in general.