# EMF Serialisierung XMI



## Gast2 (17. Nov 2010)

Hallo zusammen,

da man EMF Klassen nur beschränkt oder umständlich serialisieren kann, wollte ich die Serialisierung über XMI machen. Sende ich an den Server dann das XMI File oder nur den XMIString? Was ist die bessere Variante? Und wenn ich den String schicke, wie bekomme ich den aus der Resource hinaus?


```
private String writeXMI(final List<EObject> objects) {
		
	     Resource xmiResource = new XMIResourceImpl();
	     xmiResource.getContents().addAll(objects);
	     xmiResource.save(null);
		
//	    return sw.toString();
	}
```

Okay ich hab einfach das File übermittel und klappt ganz gut...


----------



## Wildcard (17. Nov 2010)

Du kannst bei save auch einen OutputStream mitgeben über den serialisiert werden soll


----------



## Gast2 (17. Nov 2010)

Und was send ich dann an den Server? Den OutputStream?


----------



## Wildcard (17. Nov 2010)

*lach*
Du must ja in irgendeiner Form eine Socket Verbindung zum Server haben. Du serialisiert also einfach in den OutputStream des Sockets.


----------



## Gast2 (17. Nov 2010)

Nee ich hab ne HTTP Verbindung und einfach ein Interface auf beiden Seiten dazu.


----------



## Wildcard (17. Nov 2010)

Eine HTTP Verbindung läuft auch über ein Socket. Du hast einen InputStream und einen OutputStream auf dem Socket.


----------



## Gast2 (18. Nov 2010)

Joa das ist mir bewusst, aber ich kein Plan wo ich auf den Stream zugreifen kann.


----------



## Wildcard (18. Nov 2010)

SirWayne hat gesagt.:


> Okay ich hab einfach das File übermittel und klappt ganz gut...


Und wie hast du das gemacht? Ausserdem hast du das ganze doch anstatt Serialisierung verwendet. Wo hättest du denn einen Object Output Stream hingeschickt?


----------



## Gast2 (18. Nov 2010)

Ich hab ein Interface (wo die URL angegeben ist), welches ich vom Client ausführen kann und da geb ich ein File mit.


----------



## Wildcard (18. Nov 2010)

Und wie hätte Objektserialisierung dann funktionieren soll wenn dein Interface nur erlaub eine Datei zu verschicken?


----------



## Gast2 (18. Nov 2010)

Ich hab das Interface so geändert, dass es ein File entgegennimmt. Davor hat es ein konkretes serialisiertes Objekt entgegengenommen.


----------



## Wildcard (18. Nov 2010)

Dann änder das Interface doch so das es einen Output- oder InputStream entgegennimmt. Files sind sehr unflexibel.


----------



## Gast2 (18. Nov 2010)

Ja das hab ich doch oben gemeint ob ich dann den OutputStream an den Server übermittel.


----------



## Gast2 (18. Nov 2010)

Also mit In/Output Streams bekomme es nicht hin. Da weiß ich nicht wie ich den output stream verwenden muss... Oder muss ich den erst auf den Server wegschreiben und dann einlesen also mit Files hat es so geklappt. 
Also die serialisierung sollte über XMI gemacht werden, außerdem wandelt der XMLLoader die EMFModels in Texo Pojos um, die dann in die DB gespeichert werden.
Bsp:
Client

```
public static OutputStream writeXMI(final List<EObject> objects) {
		
		OutputStream outputStream = null;
	     XMLResource xmiResource = new XMIResourceImpl(URI.createFileURI("client.xmi"));
	     
	     xmiResource.getContents().addAll(objects);    
	     try {
			outputStream = new FileOutputStream(new File(xmiResource.getURI().toFileString()));
			xmiResource.save(outputStream,null);
		} catch (FileNotFoundException e1) {
			e1.printStackTrace();
		} catch (IOException e1) {
			e1.printStackTrace();
		}

	    return outputStream;
	}
```


```
service.saveOrUpdate(XMIUtil.writeXMI(this.persons));
```

server

```
public interface BaseService {
	 void saveOrUpdate(OutputStream xmi);
```


```
@Override
	@Transactional(propagation = Propagation.REQUIRED)
	public File saveOrUpdate(OutputStream out) {
		final List<DBObject> objects = readXML(out);
		final List<DBObject> dbObjects = new ArrayList<DBObject>();
		for(DBObject object : objects){
			dbObjects.add(baseDao.saveOrUpdate(object));
		}
		return writeXML(dbObjects);
	}
	
	protected List<DBObject> readXML(final OutputStream xml) {
	    final ModelXMLLoader xmlLoader = new ModelXMLLoader();
	    xmlLoader.setLoadAsXMI(true);
	        //hier wird ein inputstream benötigt habe aber nur ein output
		xmlLoader.setReader(new InputStreamReader(xml));
		List<DBObject> list = new ArrayList<DBObject>();
		for(Object object : xmlLoader.read()){
			list.add((DBObject) object);
		}
	    return list;
	}
```


----------



## Wildcard (18. Nov 2010)

Schwere Geburt...
Wo und wie überträgst du Daten an den Server?
Frage zwischendurch: wenn das Modell in eine DB kommt, warum hast du dann nicht EMF Teneo, oder CDO verwendet?


----------



## Gast2 (19. Nov 2010)

Wildcard hat gesagt.:


> Schwere Geburt...
> Wo und wie überträgst du Daten an den Server?
> Frage zwischendurch: wenn das Modell in eine DB kommt, warum hast du dann nicht EMF Teneo, oder CDO verwendet?



Ja sehr schwere Geburt hab auch wenig Erfarhung in dieser Richtung.
Weil der Martin Taal (Teneo und Texo) mir Texo nahe gelegt hat, weil es besser und flexibler sein soll.
Ich habe auf der Client seite EMF Models für das Databinding,Undo/Redo und Notification.
Und auf Serverseite Texo Pojos die zusammen mit einem annotierten Model die orm.xml(2.0 Teneo kann nur 1.2) generiert hat. Ich muss sagen für die Persistenz Objekte ist Texo viel besser geeignet als Teneo. BeiTexo wollen Sie auch grad JSON miteinbinden. Außerdem gibt es bei EMF Texo auch schon die ganzen Converter, für EMF <--> Texo.

Also für die Übertragung benutze ich den Spring HTTP Invoker, welcher mit ein Interface an eine URL bindet. Darüber rufe ich dann auf dem Client das entsprechende Interface Methode auf und auf dem Server wird dann die Impl dieses Interface aufgerufen.

Wie gesagt ich bekomme ein den OutputStream auf den Server aber dann weiß ich nicht was damit zu tun ist. Eventuell liegt es auch an dem Texo XMLModelLoader. Wie gesagt noch keine Erfarhungen damit gemacht :bahnhof:


----------

