1

I'm getting a serialization compatibility error from the below two classes. Only the parent class, CommericalCustomer implements serialization. What is the proper way to use the Serializable Interface when having a parent/child relation as I have below?

public class CachedCommercialCustomers extends CommercialCustomer { } public class CommercialCustomer implements Serializable { private static final long serialVersionUID = 1L; } 

Exception:

[#|2013-01-02T05:01:02.553-0800|SEVERE|glassfish3.1.2|com.hazelcast.nio.AbstractSerializer|_ThreadID=10;_ThreadName=Thread-2;|spot.api.model.vo.backoffice.CachedCommercialCustomers; local class incompatible: stream classdesc serialVersionUID = -2672531984245897526, local class serialVersionUID = -743225273062282831 java.io.InvalidClassException: com.sample.CachedCommercialCustomers; local class incompatible: stream classdesc serialVersionUID = -2672531984245897526, local class serialVersionUID = -743225273062282831 at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:579) at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1600) at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1513) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1749) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1346) at java.io.ObjectInputStream.readUnshared(ObjectInputStream.java:458) at com.hazelcast.nio.DefaultSerializer$ObjectSerializer.readNormal(DefaultSerializer.java:383) at com.hazelcast.nio.DefaultSerializer$ObjectSerializer.read(DefaultSerializer.java:353) at com.hazelcast.nio.DefaultSerializer.read(DefaultSerializer.java:134) at com.hazelcast.nio.CustomSerializerAdapter.read(CustomSerializerAdapter.java:33) at com.hazelcast.nio.AbstractSerializer.toObject(AbstractSerializer.java:116) at com.hazelcast.nio.AbstractSerializer.toObject(AbstractSerializer.java:146) at com.hazelcast.nio.Serializer.readObject(Serializer.java:72) at com.hazelcast.impl.ThreadContext.toObject(ThreadContext.java:103) at com.hazelcast.nio.IOUtil.toObject(IOUtil.java:149) at com.hazelcast.impl.BaseManager$RequestBasedCall.getResultAsObject(BaseManager.java:384) at com.hazelcast.impl.BaseManager$ResponseQueueCall.getResultAsObject(BaseManager.java:455) at com.hazelcast.impl.BaseManager$RequestBasedCall.getResultAsObject(BaseManager.java:368) at com.hazelcast.impl.BaseManager$ResponseQueueCall.getResultAsObject(BaseManager.java:455) 
8
  • 2
    Well it looks like the problem is that your CachedCommercialCustomers class has changed since you serialized the value. Personally I'd avoid Java's default binary serialization entirely... Commented Jan 2, 2013 at 21:19
  • any class extending CommercialCustomer is serializable. Commented Jan 2, 2013 at 21:29
  • add private static final long serialVersionUID = -2672531984245897526L; to CachedCommercialCustomers see what happens. Commented Jan 2, 2013 at 21:31
  • @BevynQ - I get a java.io.InvalidClassException: local class incompatible: stream classdesc serialVersionUID = -743225273062282831, local class serialVersionUID = -2672531984245897526 Commented Jan 2, 2013 at 21:42
  • 1
    @c 12 - probably where is hazelcast reading things from if it is a database or something like that you will need to remove the objects from it. Commented Jan 3, 2013 at 19:34

1 Answer 1

1

The problem here is that you don't specify a serialVersionId for your sub class - so java will generate one for you instead. A simple recompilation might change this value if you change the java source file. See the spec.

The fact that the I'd changes when the code changes is a good thing, but in some cases it will cause you some grief :)

See here for more information and how to "fix" the problem if necessary.

Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.