EMF Serialisierung XMI

G

Gast2

Gast
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?

Java:
	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...
 
Zuletzt bearbeitet von einem Moderator:

Wildcard

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

Gast2

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

Gast2

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

Gast2

Gast
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
Java:
	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;
	}

Java:
service.saveOrUpdate(XMIUtil.writeXMI(this.persons));

server
Java:
public interface BaseService {
	 void saveOrUpdate(OutputStream xmi);

Java:
@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;
	}
 
Zuletzt bearbeitet von einem Moderator:

Wildcard

Top Contributor
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?
 
G

Gast2

Gast
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:
 

Neue Themen


Oben