2013-01-02 31 views
1

我從下面兩個類中收到序列化兼容性錯誤。只有父類CommericalCustomer實現序列化。具有父/子關係時使用可序列化接口的正確方法是什麼?父/子序列化本地類不兼容異常

public class CachedCommercialCustomers extends CommercialCustomer { 


} 

public class CommercialCustomer implements Serializable { 

    private static final long serialVersionUID = 1L; 

} 

例外:

[#|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) 
+2

好吧,看起來問題是你的'CachedCommercialCustomers'類已經改變,因爲你序列化的價值。就個人而言,我會完全避免Java的默認二進制序列化... –

+0

擴展CommercialCustomer的任何類都是可序列化的。 – BevynQ

+0

添加private static final serialVersionUID = -2672531984245897526L;到CachedCommercialCustomers看看會發生什麼。 – BevynQ

回答

1

這裏的問題是,你沒有指定你的子類serialVersionId - 所以Java將產生一個給你吧。如果更改java源文件,簡單的重新編譯可能會更改此值。請參閱spec

了我最好更改時,代碼修改是一件好事,但在某些情況下,它會引起你一些悲痛:)

here的更多信息和如何「解決」問題的事實如有必要。