RMI Unserializable Exception

eQuest

Mitglied
Hi Leute,
habe ein Problem bezüglich RMI und serialisierbaren Objekten, bei dem ich eure Hilfe brauche 🙂

Also so wie ich das verstehe, kann man jedes Objekt serialisieren, indem man java.io.Serializable implementiert, seh ich das richtig? Denn komischerweiße bekomme ich eine Unserializable Exception. Ich habe hier eine kleine Verwaltungssoftware von Pizzenbestellungen.

Java:
public interface Database extends Remote{
	public void Execute_Query(String sql) throws RemoteException;
	public Result Execute_Select(String sql) throws RemoteException;
	public Result Execute_Update(String sql) throws RemoteException;
	public void initialize() throws RemoteException;
	//public void update() throws RemoteException;
}

Java:
public class DatabaseImpl extends UnicastRemoteObject implements Database{

	protected DatabaseImpl() throws RemoteException {
		super();
		initialize();
		// TODO Auto-generated constructor stub
	}

	private static final long serialVersionUID = 1L;
	private Connection connection = null;
	
	@Override
	public void Execute_Query(String sql) throws RemoteException {
		// TODO Auto-generated method stub
		Statement sqlAnw;
	
		try{
			sqlAnw = connection.createStatement();
			sqlAnw.executeQuery(sql);
		}catch(SQLException e){
			e.printStackTrace();
		}
	}

	@Override
	public Result Execute_Select(String sql) throws RemoteException {
		// TODO Auto-generated method stub
		Statement sqlAnw;
		ResultSet rs;
		
	
		try{
			sqlAnw = connection.createStatement();
			rs = sqlAnw.executeQuery(sql);
			return new Result(rs);
		}catch(SQLException e){
			e.printStackTrace();
		}
		return null;
	}

	@Override
	public Result Execute_Update(String sql) throws RemoteException {
		// TODO Auto-generated method stub
		Statement sqlAnw;
		ResultSet rs;
	
		try{
			sqlAnw = connection.createStatement();
			sqlAnw.executeUpdate(sql,1);
			rs = sqlAnw.getGeneratedKeys();
			return new Result(rs);
		}catch(SQLException e){
			e.printStackTrace();
		}
		return null;
	}
	
	public void initialize(){
		try {
			Class.forName("org.postgresql.Driver").newInstance();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		try {
			connection = DriverManager
					.getConnection("jdbc:postgresql://127.0.0.1/Pizzaverwaltung",
							"postgres", "...");
			System.out.println("Connection established");
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

DatabaseImpl wird per rmi über die Klasse Listener aufgerufen (also Listener ist praktisch der Client, welcher sich das Objekt über Naming.lookup holt und dann auf die Funktionen von DatabaseImpl zugreift).
Diese Klasse hat Funktionen, die entweder null oder Result liefern. Result ist eine von mit generierte Klasse:
Java:
public class Result implements Serializable{

	private static final long serialVersionUID = 1L;
	//Attribute
	
	private ResultSet result = null;

	public ResultSet getResult() {
		return result;
	}

	public Result(ResultSet result) {
		this.result = result;
	}

	public void setResult(ResultSet result) {
		this.result = result;
	}
	
}

und hier noch der "Server"
Java:
public class DatabaseReg {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		DatabaseImpl dataimpl = null;
		try {
			dataimpl = new DatabaseImpl();
			Naming.rebind("User", dataimpl);
			System.out.println("User registriert");
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

Ok und ich bekomme folgende Fehlermeldung:

Code:
java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
	java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: org.postgresql.jdbc3.Jdbc3ResultSet
	at sun.rmi.server.UnicastRef.invoke(Unknown Source)
	at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Unknown Source)
	at java.rmi.server.RemoteObjectInvocationHandler.invoke(Unknown Source)
	at $Proxy0.Execute_Select(Unknown Source)
	at Listener.action_anzeigen_aendern(Listener.java:132)
	at Pizza_Panel_Anzeigen$1.actionPerformed(Pizza_Panel_Anzeigen.java:65)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: org.postgresql.jdbc3.Jdbc3ResultSet
	at java.io.ObjectInputStream.readObject0(Unknown Source)
	at java.io.ObjectInputStream.defaultReadFields(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 sun.rmi.server.UnicastRef.unmarshalValue(Unknown Source)
	... 31 more
Caused by: java.io.NotSerializableException: org.postgresql.jdbc3.Jdbc3ResultSet
	at java.io.ObjectOutputStream.writeObject0(Unknown Source)
	at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
	at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
	at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
	at java.io.ObjectOutputStream.writeObject0(Unknown Source)
	at java.io.ObjectOutputStream.writeObject(Unknown Source)
	at sun.rmi.server.UnicastRef.marshalValue(Unknown Source)
	at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source)
	at sun.rmi.transport.Transport$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.rmi.transport.Transport.serviceCall(Unknown Source)
	at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source)
	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)
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at Listener.action_anzeigen_aendern(Listener.java:140)
	at Pizza_Panel_Anzeigen$1.actionPerformed(Pizza_Panel_Anzeigen.java:65)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)

Ich komme wirklich nichtmehr weiter .. anscheinend ist das Problem ja, dass Result bzw. das Attribut ResultSet nicht serialisiert werden kann, oder liege ich hier falsch?
Ich danke euch für eure Zeit, die ihr investiert, um das hier mal alles zu lesen und mir zu helfen 😉
 
Zuletzt bearbeitet:
ResultSet ist nicht mit der Markierungsschnittstelle ausgestattet(wahrshceinlich), daher kannst du dein Objekt nicht serialisieren, weil das eben auch nur andere serialisierbare Objekte beinhalten kann oder explizit durch transient gekennzeichnet wird, dass dieses nicht serialisiert werden soll, was hier wohl aber wenig Sinn machen würde. Die Frage, wieso man ein ResultSet serialisiert, stell ich jetzt mal nicht, aber könntest du nicht die einzelnen Werte innerhalb des ResultSets, also die Spalten-Werte in ein Objekt speichern? Und dieses dann serialisieren?
 
Zuletzt bearbeitet:
Java:
public class LinkedList<E>
    extends AbstractSequentialList<E>
    implements List<E>, Deque<E>, Cloneable, java.io.Serializable
-> :toll:
 
Sehe ich das richtig, das du SQL-Anweisungen durchreichst?

Da ich keiune Schulische Ausbildung genießen konnte ( ich allerdings nen dicken Kopf habe - nicht falscht verstehn 😉 ) habe ich versucht von diesem Kozept aus Sicherheitsgründen abstand zu halten.

Wenn ich von Client SQL-Anweisungen an den Server weiterreiche, ist doch eine Injection ein Kinderspiel oder sehe ich das falsch?

Nichts gegen dein Kozept, interessiert mich grade nur
 

Neue Themen


Zurück
Oben