RMI: Remote oder serialisieren

schuetzejanett

Erfahrenes Mitglied
Hallo

arbeite mich gerade in RMI ein und überlege gerade ob ich meine objekte als remote objekte versende oder seralisiere.
Das Programm ist eine Datenbankapp, wobei der client methoden vom server aufruft und dieser die dafür benötigten daten aus der datenbank abruft und in objekte speichert, diese dem client zurückliefert, damit dieser sie in der gui anzeigen kann, der client verändert keine daten sondern ist bloß fürs anzeigen und abfragen von benutzeingaben zuständig. Aus denen generiert er wieder serveranfragen und so weiter.
die Objekte bestehen aus simplen datentypen wie int aber auch aus arrays oder hashmaps, oder aus anderen Objekten( wie z.b Person hat Adresse). Kann ich diese jetzt infach durch hhinzufügen von
Code:
 ...implements serialize
serialisieren und als objekte übertragen oder sollte ich sie besser als remote objekte übertragen.
 
Hab deine Anfrage leider erst jetzt gefunden, also alle Objekte die du über RMI übertragen willst müssen serialisierbar sein und ebenso auch die Unterobjekte falls du sie selbst dek. hast.

Zu beachten ist das es auch java Objekte gibt die nicht serial. sind z.B. Streams des weiteren musst du bei allen Container Objekten wie java.util.Vector etc.tiefe Kopien machen musst da diese sonst nur Referenzen enthalten.

Tipp: Wer sich mit RMI auskennt sollte sich auch mal mit Corba beschäftigen.
Wenn du RMI einsetzt musst du dich auch mal mit dessen Rechtekonzept auseinandersetzen
Falls noch Fragen über RMI immer her damit
 
Hallo, wie meinst du das mit den tiefen kopieren habe ja klassen die ärrayliste enthalten reicht es da nicht wenn ich schreibe implements serializable muss ich da zusätzlich noch was machen?
 
Nein ich denke das reicht nicht bin mir bei ArrayList nicht sicher aber denke das es das gleiche Problem ist:

Bsp: du füllst einen java.util.Vector(); mit n byte arrays und übertragst das Object welches den Vector enthält über RMI zum Client dann beinhaltet der vector nicht die eigentlichen byte arrays sondern nur die Speicheradd. und zwar die wo die byte arrays im Speicher des Servers liegen und das nützt dir aufm client nicht mehr viel.

lad mal den Code hoch dann schau ich es mir mal an
 
hallo also hier sind zwei Klassen , die klasse AttatchmentOverviewresponse erhalte ich als rückgabeobjekt von Server.

Java:
public class AssignAttachRequest implements Serializable
{

	private static final long serialVersionUID = 1L;
	private int processID;
	private Attachment attach;
	public AssignAttachRequest(int processID, Attachment attach)
	{
		this.processID = processID;
		this.attach = attach;
	}

	public Attachment getAttach()
	{
		return attach;
	}

	public void setAttach(Attachment attach)
	{
		this.attach = attach;
	}

	public int getProcessID()
	{
		return processID;
	}

	public void setProcessID(int processID)
	{
		this.processID = processID;
	}

Und hier noch die Attachment Klasse von der ich die arraylist habe

Java:
public class AssignAttachResponse implements Serializable
{

	private static final long serialVersionUID = 1L;

	private int errorCode;

	private String errorMessage;

	public AssignAttachResponse(int errorCode, String errorMessage)
	{
		this.errorCode = errorCode;
		this.errorMessage = errorMessage;
	}
	public int getErrorCode()
	{
		return errorCode;
	}

	public String getErrorMessage()
	{
		return errorMessage;
	}

	public void setErrorCode(int errorCode)
	{
		this.errorCode = errorCode;
	}

	public void setErrorMessage(String errorMessage)
	{
		this.errorMessage = errorMessage;
	}

Es sind alles bloß solche datenobjekte, welche der server dann erstellt und zurückschickt. Und auch die parameter in den Methoden des Servers sind nur datenobjekte. Das heißt jede klasse enhält bloß konstruktor und getter bzw setter.

Geht das so oder muss ich da noch was ändern.

Und diese serialVersionId ist es da richtig die default ID zu verwenden?
 
Zuletzt bearbeitet von einem Moderator:
Also wenn nur diese 2 Ojekte über RMI versendet werden dürfte es keine Probleme geben da beide Objekte nur serialisierbare Typen enthalten und jetzt verstehe ich auch was du mit der Liste gemeint hast, ist naturlich dann auch egal ob du diese Objekte zur Datenhaltung in einer Liste verwaltest.

Falls es doch noch Probleme gibt sag einfach bescheid
 
Hat das denn eigentlich geklappt mit deinen PDF Files über RMI übertragen?
 
Zuletzt bearbeitet von einem Moderator:
Habe eine ähnliche Frage :):

Java:
ActionListener actionListenerUpdate = new ActionListener() {
			
			public void actionPerformed(ActionEvent actionEvent) {
				
				DTO dto = new DTO();
				
				try {
					  
					  Registry registry = LocateRegistry.getRegistry();
					  Service service = (Service) registry.lookup("service");
					  service.serviceFunction(dto);
					  
				    } catch (AccessException ae) {
			    	ae.printStackTrace();
			        }
				      catch (RemoteException re) {
				    	re.printStackTrace();
				      }
				      catch (NotBoundException nbe) {
				    	nbe.printStackTrace();
			          }
				      catch (Exception e) {
							e.printStackTrace();
						}
			     }
		};
		JButton btnUpdate = new JButton("Update");
		btnUpdate.addActionListener(actionListenerUpdate);

Wie kann ich das dto- Object serialisieren, da er folgende Fehlermeldung bringt:

Code:
java.rmi.MarshalException: error marshalling arguments; nested exception is: 
	java.io.NotSerializableException: net.dsb.configImport.ConfigVhs3ImportDTO
	at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:122)
	at net.dsb.configImport.ConfigVhs3Import_Stub.overrideData(Unknown Source)
	at net.dsb.swingConfigImport.GUIConfigVhs3Import$3.actionPerformed(GUIConfigVhs3Import.java:234)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1849)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2169)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
	at java.awt.Component.processMouseEvent(Component.java:5501)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3135)
	at java.awt.Component.processEvent(Component.java:5266)
	at java.awt.Container.processEvent(Container.java:1966)
	at java.awt.Component.dispatchEventImpl(Component.java:3968)
	at java.awt.Container.dispatchEventImpl(Container.java:2024)
	at java.awt.Component.dispatchEvent(Component.java:3803)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3892)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)
	at java.awt.Container.dispatchEventImpl(Container.java:2010)
	at java.awt.Window.dispatchEventImpl(Window.java:1778)
	at java.awt.Component.dispatchEvent(Component.java:3803)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
	at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
Caused by: java.io.NotSerializableException: net.dsb.configImport.ConfigVhs3ImportDTO
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1081)
	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:302)
	at sun.rmi.server.UnicastRef.marshalValue(UnicastRef.java:258)
	at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:117)
	... 26 more


Gruß Truck
 
Zurück