# class invalid for deserialization



## kulri (15. Jun 2009)

Hallo!

Ich würde gerne ein Objekt folgender Klasse Customer (de-)serialisieren, geht aber nicht. Warum?

```
@Entity
public class Customer implements Serializable
{
	private static final long serialVersionUID = 6963956891492146853L;
	private ArrayList<ProductRate> bookedRates;
	private long id;

	public Customer()
	{
		this.bookedRates = new ArrayList<ProductRate>();
	}

	@Id
	public long getId()
	{
		return id;
	}

	public void setId(long id)
	{
		this.id = id;
	}

	public void book(ProductRate productRate) throws Exception
	{
		if (!this.bookedRates.add(productRate))
		{
			throw new Exception("Unable to book product");
		}
	}

	public ArrayList<ProductRate> getBookedRates()
	{
		return this.bookedRates;
	}

	public void setBookedRates(ArrayList<ProductRate> rates)
	{
		if (rates instanceof ArrayList)
		{
			this.bookedRates = (ArrayList<ProductRate>) rates.clone();
		}
	}
}
```

Die Exception:

```
java.lang.RuntimeException: java.io.InvalidClassException: de.overturn.domain.customer.Customer; de.overturn.domain.customer.Customer; class invalid for deserialization
	at org.jboss.aop.joinpoint.MethodInvocation.getArguments(MethodInvocation.java:314)
	at org.jboss.ejb3.stateless.StatelessContainer.dynamicInvoke(StatelessContainer.java:481)
	at org.jboss.ejb3.session.InvokableContextClassProxyHack._dynamicInvoke(InvokableContextClassProxyHack.java:53)
	at org.jboss.aop.Dispatcher.invoke(Dispatcher.java:91)
	at org.jboss.aspects.remoting.AOPRemotingInvocationHandler.invoke(AOPRemotingInvocationHandler.java:82)
	at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:908)
	at org.jboss.remoting.transport.socket.ServerThread.completeInvocation(ServerThread.java:742)
	at org.jboss.remoting.transport.socket.ServerThread.processInvocation(ServerThread.java:695)
	at org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.java:522)
	at org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:230)
Caused by: java.io.InvalidClassException: de.overturn.domain.customer.Customer; de.overturn.domain.customer.Customer; class invalid for deserialization
	at java.io.ObjectStreamClass.checkDeserialize(ObjectStreamClass.java:713)
	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1733)
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
	at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1667)
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1323)
	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
	at java.rmi.MarshalledObject.get(MarshalledObject.java:142)
	at org.jboss.aop.joinpoint.MethodInvocation.getArguments(MethodInvocation.java:309)
	at org.jboss.ejb3.stateless.StatelessContainer.dynamicInvoke(StatelessContainer.java:481)
	at org.jboss.ejb3.session.InvokableContextClassProxyHack._dynamicInvoke(InvokableContextClassProxyHack.java:53)
	at org.jboss.aop.Dispatcher.invoke(Dispatcher.java:91)
	at org.jboss.aspects.remoting.AOPRemotingInvocationHandler.invoke(AOPRemotingInvocationHandler.java:82)
	at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:908)
	at org.jboss.remoting.transport.socket.ServerThread.completeInvocation(ServerThread.java:742)
	at org.jboss.remoting.transport.socket.ServerThread.processInvocation(ServerThread.java:695)
	at org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.java:522)
	at org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:230)
	at org.jboss.remoting.MicroRemoteClientInvoker.invoke(MicroRemoteClientInvoker.java:206)
	at org.jboss.remoting.Client.invoke(Client.java:1708)
	at org.jboss.remoting.Client.invoke(Client.java:612)
	at org.jboss.aspects.remoting.InvokeRemoteInterceptor.invoke(InvokeRemoteInterceptor.java:60)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
	at org.jboss.aspects.tx.ClientTxPropagationInterceptor.invoke(ClientTxPropagationInterceptor.java:61)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
	at org.jboss.ejb3.security.client.SecurityClientInterceptor.invoke(SecurityClientInterceptor.java:65)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
	at org.jboss.ejb3.remoting.IsLocalInterceptor.invoke(IsLocalInterceptor.java:74)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
	at org.jboss.aspects.remoting.PojiProxy.invoke(PojiProxy.java:62)
	at $Proxy3.invoke(Unknown Source)
	at org.jboss.ejb3.proxy.handler.ProxyInvocationHandlerBase.invoke(ProxyInvocationHandlerBase.java:261)
	at org.jboss.ejb3.proxy.handler.session.SessionSpecProxyInvocationHandlerBase.invoke(SessionSpecProxyInvocationHandlerBase.java:101)
	at $Proxy2.createCustomer(Unknown Source)
	at de.overturn.client.AppClient.main(AppClient.java:29)
	at org.jboss.aspects.remoting.InvokeRemoteInterceptor.invoke(InvokeRemoteInterceptor.java:72)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
	at org.jboss.aspects.tx.ClientTxPropagationInterceptor.invoke(ClientTxPropagationInterceptor.java:61)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
	at org.jboss.ejb3.security.client.SecurityClientInterceptor.invoke(SecurityClientInterceptor.java:65)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
	at org.jboss.ejb3.remoting.IsLocalInterceptor.invoke(IsLocalInterceptor.java:74)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
	at org.jboss.aspects.remoting.PojiProxy.invoke(PojiProxy.java:62)
	at $Proxy3.invoke(Unknown Source)
	at org.jboss.ejb3.proxy.handler.ProxyInvocationHandlerBase.invoke(ProxyInvocationHandlerBase.java:261)
	at org.jboss.ejb3.proxy.handler.session.SessionSpecProxyInvocationHandlerBase.invoke(SessionSpecProxyInvocationHandlerBase.java:101)
	at $Proxy2.createCustomer(Unknown Source)
	at de.overturn.client.AppClient.main(AppClient.java:29)
Caused by: java.io.InvalidClassException: de.overturn.domain.customer.Customer; class invalid for deserialization
	at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:587)
	at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1583)
	at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1496)
	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1732)
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
	at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1667)
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1323)
	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
	at java.rmi.MarshalledObject.get(MarshalledObject.java:142)
	at org.jboss.aop.joinpoint.MethodInvocation.getArguments(MethodInvocation.java:309)
	at org.jboss.ejb3.stateless.StatelessContainer.dynamicInvoke(StatelessContainer.java:481)
	at org.jboss.ejb3.session.InvokableContextClassProxyHack._dynamicInvoke(InvokableContextClassProxyHack.java:53)
	at org.jboss.aop.Dispatcher.invoke(Dispatcher.java:91)
	at org.jboss.aspects.remoting.AOPRemotingInvocationHandler.invoke(AOPRemotingInvocationHandler.java:82)
	at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:908)
	at org.jboss.remoting.transport.socket.ServerThread.completeInvocation(ServerThread.java:742)
	at org.jboss.remoting.transport.socket.ServerThread.processInvocation(ServerThread.java:695)
	at org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.java:522)
	at org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:230)
```

Ich suche schon ne ganze Zeit nach einer Lösung und habe folgende Gründe für NICHT (de-)serialisierbare Klassen/Obejekte gefunden:

* The serial version of the class does not match that of the class descriptor read from the stream
* The class contains unknown datatypes
* The class does not have an accessible no-arg constructor

Auf meine Klasse trifft da aber keiner dieser Gründe zu. Oft wurde auch gesagt, es habe mit nicht kompatiblen java-versionen zu tun, das hat aber in den jeweiligen threads niemand bestätigt.

Weiß jemand weiter?

Danke.


----------



## SlaterB (15. Jun 2009)

wie willst du denn bei so komplexen Dingen wie org.jboss.remoting sicher sein, dass z.B. nicht in verschiedenen alten Jars verschiedene Versionen der Klasse liegen?
in einem einfachen Testprogramm mit main-Methode und write + read tritt kein Fehler auf, oder?

ein guter Test wäre, die Klasse nun nicht weiter zu ändern, sondern nur umzubenennen in Customer2,
dann alle alten Datenbestände löschen, alles neu kompilieren, deployen usw.,
immer noch Exception?

läuft der JBoss unter einer anderen JVM-Version?


----------



## kulri (15. Jun 2009)

war ein guter Hinweis. Ich hab alles vom Server gelöscht und neu deployed, und voila, es funktioniert.
Danke.


----------

