mit eigener Klasse typisierte ArrayList übergeben funktioniert nicht
Hallo,
habe ein Problem mit SIMON und Methodenaufrufen, die eine ArrayList zurückgeben. Enthält die ArrayList Strings funktioniert alles, sobald ich aber eine ArrayList mit Objekten von eigenen Klassen übergeben will, wirft der Client folgende Exception
de.root1.simon.exceptions.SimonRemoteException: session was closed. sessionid=0x00000002
at de.root1.simon.Dispatcher.interruptWaitingRequests(Dispatcher.java:761)
at de.root1.simon.Dispatcher.sessionClosed(Dispatcher.java:812)
at org.apache.mina.core.filterchain.DefaultIoFilterChain$TailFilter.sessionClosed(DefaultIoFilterChain.java:665)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextSessionClosed(DefaultIoFilterChain.java:395)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$900(DefaultIoFilterChain.java:46)
at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.sessionClosed(DefaultIoFilterChain.java:781)
at org.apache.mina.filter.codec.ProtocolCodecFilter.sessionClosed(ProtocolCodecFilter.java:387)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextSessionClosed(DefaultIoFilterChain.java:395)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$900(DefaultIoFilterChain.java:46)
at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.sessionClosed(DefaultIoFilterChain.java:781)
at org.apache.mina.core.filterchain.IoFilterAdapter.sessionClosed(IoFilterAdapter.java:95)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextSessionClosed(DefaultIoFilterChain.java:395)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.fireSessionClosed(DefaultIoFilterChain.java:388)
at org.apache.mina.core.service.IoServiceListenerSupport.fireSessionDestroyed(IoServiceListenerSupport.java:244)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.removeNow(AbstractPollingIoProcessor.java:580)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.removeSessions(AbstractPollingIoProcessor.java:540)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.access$600(AbstractPollingIoProcessor.java:67)
at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:1087)
at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Der Server wirft keine Exception.
Die Objekte die in der ArrayList stecken sind serialisierbar und können außerhalb der ArrayList auch übergeben werden...
Geht sowas (eigene Klassen in ArrayList übergeben) überhaupt? Einige Felder in ArrayList sind ja nicht serialisierbar...
Gruß Christian aka Mable
p.S.: Wenn gewünscht kann ich auch mal meinen Code anhängen, hab ihn nur grad nciht zur Hand...
Replies (20)
RE: mit eigener Klasse typisierte ArrayList übergeben funktioniert nicht - Added by achristian 11 months ago
Ein kurzes, kompilierbares Beispiel wäre praktisch. Wundert mich etwas dass keine Exception auftritt die mehr sagt als "SessionClosed".
Gruß
Alex
RE: mit eigener Klasse typisierte ArrayList übergeben funktioniert nicht - Added by Heslacher 11 months ago
Hallo Christian,
bei mir funktioniert dieses Vorgehen problemlos. Ich kann ja nicht sage, wie Du es realisieren wolltest.
Mein Weg:
Interface1 extends Serializable
Interface2 extends Serializable
KonkreteKlasse1 implements Interface1 <- Das einzelne Objekt
KonkreteKlasse2 implements Interface2 <- Beinhaltet ArrayList<Interface1>
Server: funktion das ein Interface2 zurück gibt.
RE: mit eigener Klasse typisierte ArrayList übergeben funktioniert nicht - Added by Mable 11 months ago
Hallo,
war unterwegs, daher die Verspätung...
Das ganze soll in einem RCP Projekt laufen, ich hab das ganze mal in "normalem" Java nachgebaut und hänge eine .zip mit meinen 3 Eclipseprojekten an (angelegt nach dem Eclipse Tutorial im Wiki). Erstellt mit Eclipse Indigo 32bit.
Jetzt bekomme ich immerhin auch eine ordentliche Exception, nämlich eine "NullPointer", allerdings weiß ich trotzdem nicht warum....
@Heslacher
So versuche ich das auch, allerdings versuche ich mittels einer Methode in "KonkreteKlasse2" die ArrayLIst zurückzugeben.
Für die, die sich den Anhang nicht anschauen wollen:
Ich habe 3 Projekte
Shared
Server
Client
1. Shared - hat 2 Interfaces
1public interface IPerson extends java.io.Serializable {
2
3 public abstract String getLastname();
4 public abstract String getFirstname();
5
6 public abstract void setLastname(String lastname);
7 public abstract void setFirstname(String firstname);
8
9}
10
1public interface ICrowd extends java.io.Serializable {
2
3 public abstract List<IPerson> getPersons();
4 public abstract void setPersons (List<IPerson> persons);
5 public abstract String getTest();
6
7}
8
2. Server - Server "main" Klasse + Implementation der beiden Interfaces
1@SimonRemote(value = {IPerson.class})
2public class Person implements IPerson {
3
4 String firstname, lastname;
5 static final long serialVersionUID = 1L;
6
7 @Override
8 public String getLastname() {
9 return this.lastname;
10 }
11
12 @Override
13 public String getFirstname() {
14 return this.firstname;
15 }
16
17 @Override
18 public void setLastname(String lastname) {
19 this.lastname = lastname;
20
21 }
22
23 @Override
24 public void setFirstname(String firstname) {
25 this.firstname = firstname;
26
27 }
28}
1@SimonRemote(value = {ICrowd.class})
2public class Crowd implements ICrowd {
3
4 static final long serialVersionUID = 1L;
5
6 List<IPerson> persons = new ArrayList<IPerson>();
7
8 @Override
9 public List<IPerson> getPersons() {
10 return this.persons;
11 }
12
13 @Override
14 public void setPersons(List<IPerson> persons) {
15 this.persons = persons;
16
17 }
18
19 @Override
20 public String getTest(){
21 return "test";
22 }
23}
1public class Server {
2
3 public static void main(String[] args) throws Exception,
4 UnknownHostException, IOException, NameBindingException {
5
6 // create the "crowd" object with some test data
7 IPerson p1 = new Person();
8 IPerson p2 = new Person();
9 IPerson p3 = new Person();
10
11 List<IPerson> persons = new ArrayList<IPerson>();
12 ICrowd crowd = new Crowd();
13
14 p1.setFirstname("Martin");
15 p1.setLastname("Mustermann");
16
17 p2.setFirstname("Marta");
18 p2.setLastname("Musterfrau");
19
20 p3.setFirstname("Michael");
21 p3.setLastname("Musterkind");
22
23 persons.add(p1);
24 persons.add(p2);
25 persons.add(p3);
26
27 crowd.setPersons(persons);
28
29 // create the server's registry ...
30 Registry registry = Simon.createRegistry(22222);
31
32 // ... where we can bind the serverobject to
33 registry.bind("server", crowd);
34
35 System.out.println("Server up and running!");
36
37 //test, if "crowd" was populated correctly
38 for (int i=0;i<crowd.getPersons().size();i++){
39 System.out.print(crowd.getPersons().get(i).getFirstname()+" ");
40 System.out.print(crowd.getPersons().get(i).getLastname());
41 System.out.print("\n");
42 }
43
44 // shut down the server at user input
45 Scanner sc = new Scanner(System.in);
46 sc.next();
47 registry.unbind("server");
48 registry.stop();
49 System.out.println("Server exit");
50
51 }
52
53}
3. Der Client
1public class Client {
2
3 public static void main(String[] args) throws Exception{
4
5 Lookup nameLookup = Simon.createNameLookup("127.0.0.1", 22222);
6 ICrowd crowd = (ICrowd) nameLookup.lookup("server");
7
8 // getTest() only returns "test" - works
9 System.out.println(crowd.getTest());
10
11 // try to get the ArrayList<IPerson> - NullPointerException....
12 System.out.println(crowd.getPersons().get(0).getFirstname());
13
14 nameLookup.release(crowd);
15
16 }
17
18}
Warhscheinlich habe ich irgendwo was übersehen, oder ich mach was grundsätzlich falsch. Hoffe es kann jemand damit etwas anfangen.
Danke im Vorraus für die Mühen
Gruß Christian aka Mable
simontestArrayList.zip - Versuch mit SIMON ArrayList gefüllt mit eigenen Typen zu übergeben; Eclipseprojekte (19.3 kB)
RE: mit eigener Klasse typisierte ArrayList übergeben funktioniert nicht - Added by achristian 11 months ago
Danke für den Sample-Code. Werd's mir jetzt Anfang der Woche gleich anschauen und Rückmeldung geben.
- Alex
RE: mit eigener Klasse typisierte ArrayList übergeben funktioniert nicht - Added by Heslacher 10 months ago
Hallo Christian,
ich habe Dein sample gerade mal getestet ( ich benutze noch Simon 1.1.0 ) und es funktioniert einwandfrei. Was für eine Simon Version benutzt Du ?
Gruß
Hannes
RE: mit eigener Klasse typisierte ArrayList übergeben funktioniert nicht - Added by Mable 10 months ago
Moin!
Also ich verwende 1.1.2 aber auch mit 1.1.0 kommt bei mir die Exception.
Kannst du mal die Schritte beschreiben, die du ausgeführt hast um mein Sample zu kompilieren und zu starten?
Welches Betriebssystem, welche IDE und welche Java Version verwendest du?
Ich versuche das auf MacOSX 10.6 mit Eclipse Indigo 32bit.
Wobei die Wahrscheinlichkeit viel höher ist, dass das Problem bei mir liegt und nicht bei meinem Rechner... :)
Gruß Christian
p.s.: Die Eclipse Konsolenausgabe als Anhang...
exception.rtf - Konsolenausgabe beim Versuch den Client zu starten (12.1 kB)
RE: mit eigener Klasse typisierte ArrayList übergeben funktioniert nicht - Added by Heslacher 10 months ago
Hallo,
also, ich habe mir eine neue JavaApplication erstellt und darin 3 Quellpakete ( Client,Server und Shared ). Beim Client liegt dann Deine Client klasse rein kopiert, bei Shared habe ich ICrowd und IPerson rein kopiert und beim Server habe ich Server,Person und Crowd reinkopiert. Jeweils von Deinen .java source files. Dann habe ich den Server und den Client gestartet direkt aus der IDE heraus.
OS: WinXP 32 bit
IDE: Netbeans 6.9.1
Java: 1.6.0_21
im Anhang mein (bzw Dein) Project als Netbeans Projekt.
JavaApplication41.zip (20.5 kB)
RE: mit eigener Klasse typisierte ArrayList übergeben funktioniert nicht - Added by achristian 10 months ago
Hab mir mal eben die Exception angeschaut. Darin ist von einer NullPointerException die rede. Die trat auf, als eine Error-Nachricht transferiert werden sollte. Ist wohl ein Bug. Aber selbst mit gefixtem Bug: Es wird eine Error-Nachricht verschickt, was letzten endes zu einer ClosedSession führt. Die Frage ist jetzt: Warum entsteht diese Nachricht.
Schau mir gleich die Samples an. Kann allerdings aktuell nur mit Win7 + Eclipse testen.
Gruß
Alex
{update}
So, habs in Eclipse reingezogen und SIMON 1.1.2 hinzugefügt. Fehler ist reproduzierbar. Ich debugg dann mal.
RE: mit eigener Klasse typisierte ArrayList übergeben funktioniert nicht - Added by Mable 10 months ago
Hmmm....
Jetzt bin ich komplett verwirrt...
Also wenn ich ein Projekt anlege mit 3 verschiedenen Paketen funktioniert es. Lege ich aber 3 Projekte an (analog der Wiki Beschreibung für Eclipse), funktioniert es schon nicht mehr und ich bekomme "meine" Exception (sowohl in Netbeans als auch in Eclipse).
Jemand eine Erklärung?
Gruß Christian
/edit
Win7 mit Eclipse hat genau das gleiche Verhalten wie auf meinem OSX 10.6 mit Eclipse.
Gerade bei unserem Azubi getestet...
RE: mit eigener Klasse typisierte ArrayList übergeben funktioniert nicht - Added by achristian 10 months ago
Also wenn ich ein Projekt anlege mit 3 verschiedenen Paketen funktioniert es. Lege ich aber 3 Projekte an (analog der Wiki Beschreibung für Eclipse), funktioniert es schon nicht mehr
Klingt nach einem Classpath-Problem. Aber in deinem ersten Sample ist der eigentlich richtig gesetzt. Bin mit dem debuggen noch nicht weiter (Maven-Projekte gehen ja in Eclipse 3.6 nicht out-of-the-box :-( ). Dauert ein klein wenig.
- Alex
RE: mit eigener Klasse typisierte ArrayList übergeben funktioniert nicht - Added by achristian 10 months ago
Was mit gerade auffällt:
Wenn eine Remote-Methode als Rückgabewert eine bestimmte Klasse hat, dann muss der Client über die Implementierung der Klasse verfügen. Andernfalls kann er die serialisierte Instanz nicht wieder deserialisieren. Dein ICrowd Interface liefert aber IPerson-Objekte zurück, und zwar als Teil einer Liste. Beim zusammenbauen auf Clientseite knallt's dann, weil der Client nicht weiß wie er das Objekt deserialisieren soll. Zum Deserialisieren ist die Klasse notwendig. Das Interface alleine reicht nicht aus. Ist leider ein Design-Problem das ich nicht wirklich mit SIMON lösen kann.
Werde das gleich mal in deinem Sample umbauen und verifizieren.
RE: mit eigener Klasse typisierte ArrayList übergeben funktioniert nicht - Added by Heslacher 10 months ago
Hallo Christian,
dann dürfte aber [[*Sample session pattern*]http://dev.root1.de/projects/simon/wiki/Sample_session_pattern] aus dem wiki nicht funktionieren, da der Client nur das SessionInterface nicht aber die Klasse Session kennt. Meine immer noch in arbeit befindliche Anwendung würde dann auch nicht funktioieren ;-)
RE: mit eigener Klasse typisierte ArrayList übergeben funktioniert nicht - Added by achristian 10 months ago
Nope. Im Session Pattern Sample wird das Objekt direkt übergeben. Simon erkennt das und macht ein Remote-Objekt daraus. Und bei Remote-Objekten reicht ein Interface, da auf Client-Seite nichts deserialisiert wird, sondern ein Proxy-Objekt erzeugt wird, welches alle Aufrufe zum Server zur implementierung weiterleitet.
In diesem Beispiel hier wird aber eine Liste mit solchen Objekten übergeben. Und da SIMON nicht jedes beliebige Container-Objekt ausseinander nimmt und reinschaut ob da nicht auch etwas drin ist was man zum Remote-Objekt machen könnte, wird der Inhalt der Liste einfach stupide serialisiert und deserialisiert. Und hierfür benötigt man die Implementierung.
Die erkennung ob der Rückgabewert ein Remote-Objekt werden bzw. sein soll, funktioniert nur auf erster Ebene.
RE: mit eigener Klasse typisierte ArrayList übergeben funktioniert nicht - Added by Heslacher 10 months ago
Da hast Du ja sowas von recht. ;-)
RE: mit eigener Klasse typisierte ArrayList übergeben funktioniert nicht - Added by achristian 10 months ago
So, hab das ganze nochmal getestet.
In 1.1.2 gibts noch einen Bug in der MsgErrorEncoder Klasse, welcher verhindert, dass am Server so eine Exception hier vom Client ankommt:
---serverconsole----
Server up and running!
Martin Mustermann
Marta Musterfrau
Michael Musterkind
Exception in thread "Simon.Dispatcher.WorkerPool.#1" de.root1.simon.exceptions.SimonException: An error occured while reading a message for remote object '<NoRemoteObjectNameAvailable>'. Error message: Error while decoding message. sequence=3 bodySize=162 type=3
at de.root1.simon.ProcessMessageRunnable.processError(ProcessMessageRunnable.java:700)
at de.root1.simon.ProcessMessageRunnable.run(ProcessMessageRunnable.java:178)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: org.apache.mina.core.buffer.BufferDataException: java.io.InvalidClassException: failed to read class descriptor
at org.apache.mina.core.buffer.AbstractIoBuffer.getObject(AbstractIoBuffer.java:1984)
at de.root1.simon.codec.base.MsgInvokeReturnDecoder.decodeBody(MsgInvokeReturnDecoder.java:55)
at de.root1.simon.codec.base.AbstractMessageDecoder.decode(AbstractMessageDecoder.java:97)
at org.apache.mina.filter.codec.demux.DemuxingProtocolDecoder.doDecode(DemuxingProtocolDecoder.java:178)
at org.apache.mina.filter.codec.CumulativeProtocolDecoder.decode(CumulativeProtocolDecoder.java:178)
at org.apache.mina.filter.codec.ProtocolCodecFilter.messageReceived(ProtocolCodecFilter.java:241)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:434)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1200(DefaultIoFilterChain.java:46)
at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:796)
at org.apache.mina.core.filterchain.IoFilterAdapter.messageReceived(IoFilterAdapter.java:119)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:434)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.fireMessageReceived(DefaultIoFilterChain.java:426)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.read(AbstractPollingIoProcessor.java:693)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:646)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:635)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.access$400(AbstractPollingIoProcessor.java:67)
at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:1079)
at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64)
... 3 more
Caused by: java.io.InvalidClassException: failed to read class descriptor
at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
at java.io.ObjectInputStream.readClassDesc(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at java.util.ArrayList.readObject(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at java.io.ObjectStreamClass.invokeReadObject(Unknown Source)
at java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at org.apache.mina.core.buffer.AbstractIoBuffer.getObject(AbstractIoBuffer.java:1982)
... 20 more
Caused by: java.lang.ClassNotFoundException: de.mable.simontest.server.Person
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at org.apache.mina.core.buffer.AbstractIoBuffer$3.readClassDescriptor(AbstractIoBuffer.java:1962)
... 36 more
---/serverconsole----
Wenn man die Implementierungsklassen in das Shared-Projekt verschiebt (und in diesem Fall dem Shared-Projekt noch die Dependency zu SIMON hinzufügt) [siehe Anhang], dann funktioniert's (auch ohne 1.1.2 MsgErrorEncoder Bugfix).
Allerdings ist das Konzept etwas "schräg". Erklärung:
Person und Crowd sind Remote-Objekte. Die können hin und her transferiert werden (in grenzen). Jetzt bietet aber Crowd eine Liste vom Remote-Objekten (nämlich Person) an. Da SIMON wie gesagt nur auf erstem Level Remote-Objekte als solches erkennen kann (man kann sich hier selbst ausmalen wie komplex das wird wenn es auf allen Levels ginge), macht es eigentlich keinen Sinn Person-Objekte in einer Liste zum Client zu schicken. Denn selbst wenn man das mit dem deserialisieren hinkriegt (wie weiter oben in diesem Post beschrieben), dann sind die Methoden die man auf Person ausführen kann nur lokal, und nicht auf dem Server.
Auch wenn SIMON (und RMI übrigens in gleicher weise) den Eindruck erweckt dass man quasi keine Hürden hat was die Netzwerkkommunikation angeht, muss man im Hinterkopf behalten, dass nach wie vor zwei JVM-Instanzen vorhanden sind (Client und Server) und Objekte nunmal nur in einer Instanz leben. Und das ist meist auf dem Server...
Gruß
Alex
Capture.PNG (25.1 kB)
RE: mit eigener Klasse typisierte ArrayList übergeben funktioniert nicht - Added by achristian 10 months ago
RE: mit eigener Klasse typisierte ArrayList übergeben funktioniert nicht - Added by Mable 10 months ago
Moin Alex,
da wäre ich im Leben nicht drauf gekommen...
Funktioniert nun super (auch in meiner RCP Anwendung)! Mit dem verschieben meines Modells in das Shared Projekt kann ich leben...
Vielen, vielen dank euch beiden!
Gruß Christian
RE: mit eigener Klasse typisierte ArrayList übergeben funktioniert nicht - Added by Mable 10 months ago
lol.
Lesen bildet.
Nachdem ich mich schon gewundert habe, dass der Aufruf von z.B.: Setter-Methoden das Objekt nicht verändert habe ich den Satz
"...macht es eigentlich keinen Sinn Person-Objekte in einer Liste zum Client zu schicken. Denn selbst wenn man das mit dem deserialisieren hinkriegt (wie weiter oben in diesem Post beschrieben), dann sind die Methoden die man auf Person ausführen kann nur lokal, und nicht auf dem Server."
jetzt auch kapiert...
Kopf -> Tisch!
-> noch mal zurück ans Reißbrett...
Jemand eine Idee, wie man sowas sonst elegant lösen könnte?
Sprich ich habe eine unbekannte und veränderliche Anzahl von "Personen" (oder sonstigen Objekten), die auf dem Client zur Verfügung stehen sollen?
Gruß Mabla aka Christian
RE: mit eigener Klasse typisierte ArrayList übergeben funktioniert nicht - Added by Heslacher 10 months ago
Hallo Christian,
ein Lösungsansatz:
Erstelle ein Interface IPersonIdendity mit einer getter methode um eine eindeutige PersonenID vom Server zu bekommen. Erstelle in Deinem Shared Projekt eine konkrete Klasse die dieses Interface implementiert, und gib diese Klasse als Arraylist über Deine konkrete implementierung von ICrew zurück. Im Server erstellst Du dann noch eine getter methode z.B. IPerson getPerson(int ID){}, die Du dann mit der jeweiligen ID aufrufen kannst um dann eine IPerson zurückzubekommen, deren Funktionen Du dann auf dem Server aufrufen kannst.
RE: mit eigener Klasse typisierte ArrayList übergeben funktioniert nicht - Added by achristian 10 months ago
Finde die Lösung mit IDs irgendwie antiquiert ..
Mein Vorschlag:
Lass die getPersonList Methode so wie sie ist. Biete dazu parallel eine updatePerson(IPerson aPerson) Methode an.
Der Client kann sich dann mit der ersten Methode die Liste mit Personen holen, diese lokal modifizieren, und dann die Update-Methode nutzen um die Änderung am server zu propagieren.
Wenn du jetzt 634639452 Personen auf einmal verändern willst, dann wär's geschickt eine update-Methode anzubieten die eine ganze Liste mit Personen annimmt. Sonst hast du da 634639452 Methodenaufrufe und den damit verbundenen Overhead.
Im Prinzip ist das nix weiter wie das CRUD Prinzip (http://de.wikipedia.org/wiki/CRUD) auf ein Remote-Interface abgebildet, statt nur die getter/setter der einzelnen Pojos zu nutzen.
- Alex
(1-20/20)