# Serialisierung + ClassLoader



## ernstername (17. Apr 2010)

Hallo,

ich möchte über Netzwerk ein serialisiertes Object einer Klasse (Test) als Datei, und die dazugehörige .class Datei schicken. Eine Klasse Load soll auf einem entfernten Rechner die .class Datei laden sowie das Serialisierte Object der Klasse, deserialisieren (alles ohne RMI!). Das Serialisieren des Objectes und schicken der .class klappt, die Frage ist, wie schreibe ich mir den ClassLoader dazu? 

Klasse Test:

```
public class Test implements Serializable {

    public int version;
    
	private static final long serialVersionUID = 1L;
	
	public Test(int version) {
		this.version = version;
	}
	
	public static void main(String[] args) throws IOException {
        FileOutputStream fos = new FileOutputStream("D:\\test\\Test.ser");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        Test ts = new Test(100);
        oos.writeObject(ts);
        oos.flush();
        oos.close();
	}
}
```

Klasse Load:

```
public class Load {
	

	  public static void main( String[] args ) throws Exception   {    
		  Loads lc = new Load();
		  URL url = new File("D:\\workspace\\Test\\bin").toURI().toURL(); 
		  ClassLoader cl = new URLClassLoader(new URL[]{ url } );
		  Class<?> c = cl.loadClass("test.Test");
		  
		  //c.newInstance();

		  FileInputStream fis = new FileInputStream("D:\\test\\Test.ser");
	                    ObjectInputStream oin = new ObjectInputStream(fis);
	                    Load lo = (Load) oin.readObject(); //Fehler: ClassNotFoundException

	  } 
}
```


----------



## Tente (17. Apr 2010)

Warum so kompliziert? Lager die Klassen, deren Objekte du über das Netzwerk verschicken willst in eine Bibliothek aus und binde in den Client und den Server jeweils die Bibliothek mit den serialisierbaren Netzwerkklassen ein.. So wie mans eigentlich immer macht...


----------



## ernstername (17. Apr 2010)

Tente hat gesagt.:


> Warum so kompliziert? Lager die Klassen, deren Objekte du über das Netzwerk verschicken willst in eine Bibliothek aus und binde in den Client und den Server jeweils die Bibliothek mit den serialisierbaren Netzwerkklassen ein.. So wie mans eigentlich immer macht...



Verstehe ich nicht...

Es ist ja nur ein Objekt, das serialisiert werden soll. Was meinst du mir Bibliothek? Wie soll man die Bibliothek einbinden? Ein Beispeil mit Code wäre hilfreich! Danke


----------



## Tente (17. Apr 2010)

Also du hast zwei Seiten, die mit einander Kommunizieren sollen. Entweder ein Client und ein Server, oder alternativ zwei Clients mit Peer to Peer. Ganz egal. Jedenfalls sollen diese untereinander Daten in Form von Objecten austauschen können. Du hattest vor die Objekte zu serialisieren und zu verschicken und dann direkt die klassen mitzuschicken. das nicht klug finde ich.

stattdessen legst du in deiner entwicklungsumgebung ein neues projekt an. in dieses objekt lagerst du alle klassen aus, deren objekte serialisiert über das netzwerk verschickt werden sollen.

zb soeine klasse: 


```
public class MessageObject implements Serializable {

	private static final long serialVersionUID = 1751538710306370018L;
	
	private String sender;
	private String receiver;
	private String chatmessage;
	private int userID;

	public MessageObject(String sender, String receiver, int userID, String message) {
		this.sender = sender;
		this.userID = userID;
		this.receiver = receiver;
		this.chatmessage = message;
	}
	
	public String getSender() {
		return sender;
	}

	public String getReceiver() {
		return receiver;
	}

	public String getChatmessage() {
		return chatmessage;
	}
	
	public int getUserID() {
		return userID;
	}

}
```

in eclipse kannst du das Objekt-projekt für die entwicklung direkt in den anderen beiden projekten referenzieren. später musst du die kompilierte jar datei in das client und server projekt einbinden, damit du die objekte austauschen kannst... fakt ist: beide seiten müssen die klassen kennen, die über das netzwerk laufen. das ereichst du entweder über diene methode, oder über die elegantere, wie ich finde, indem du die netzwerk-klassen in ein eigenes projekt packst und dieses in den anderen projekten wiederverwendest.


----------



## FArt (19. Apr 2010)

Du kannst die Klasse temporär ins Filesystem des Empfängers schreiben und über einen UrlClassLoader laden. Was ist mit abhängigen Klassen? Kannst du sicher sein, dass die Klasse beim Empfänger nicht schon existiert und es somit zu konflikten kommen kann?

Hört sich aber ein wenig seltsam an. Vielleicht beschreibst du, was du eigentlich damit erreichen willst. Ich könnte mir vorstellen, dass es da insgesamt eine besser Lösung für dein Vorhaben gibt.


----------



## SlaterB (19. Apr 2010)

siehe auch 
http://www.java-forum.org/allgemein...alisiertes-objekt-ueber-socket-nachladen.html
und den Link
Serialization - ObjectInputStream and Class Loading [Locked]
den ich da schon nannte


----------

