serialVersionUID and InvalidClassException
If serialVersionUid not defined in java class and there some change made before deserialization, it will throw InvalidClassException.
java.io.InvalidClassException: core.serialization.Employee;
local class incompatible: stream classdesc serialVersionUID = 7333563242382674116,
local class serialVersionUID = -5668805012934441006
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:621)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1623)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1774)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
at core.serialization.SerializationUtil.deserialize(SerializationUtil.java:19)
The reason is clear that serialVersionUID of the previous class and new class are different. Actually if the class doesn’t define serialVersionUID, it’s getting calculated automatically and assigned to the class.Java uses class variables, methods, class name, package etc to generate this unique long number.
Avoid InvalidClassException by using serialVersionUID:
Java Serialization permits some changes in the java class if they can be ignored. Some of the changes in class that will not affect the deserialization process are:
1.Adding new variables to the class.
2.Changing the variables from transient to non-transient, for serialization it’s like having a new field.
3.Changing the variable from static to non-static, for serialization it’s like having a new field.
But for all these changes to work, the java class should have serialVersionUID defined for the class.
No comments:
Post a Comment