-
Bug
-
Resolution: Fixed
-
Blocker
-
7.0.1
-
None
-
None
The Serialization works fine, but the deserialization is the problem. Here is a little test case.
SimpleDesktopCacheSerializationTest.java
import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import org.zkoss.zk.ui.impl.SimpleDesktopCache; import org.zkoss.zk.ui.util.Configuration; public class SimpleDesktopCacheSerializationUnitTest { public static void main(final String... args) { final Configuration config = new Configuration(); final SimpleDesktopCache sdc = new SimpleDesktopCache(config); try { read(write(sdc)); } catch (final Exception e) { e.printStackTrace(); } } public static byte[] write(final Object object) throws Exception { final ByteArrayOutputStream binOut = new ByteArrayOutputStream(); final ObjectOutputStream out = new ObjectOutputStream(binOut); out.writeObject(object); out.flush(); out.close(); return binOut.toByteArray(); } public static Object read(final byte[] data) throws Exception { final ByteArrayInputStream bIn = new ByteArrayInputStream(data); final ObjectInputStream in = new ObjectInputStream(bIn); return in.readObject(); } }
The problem is in the the methode readObject(final java.io.ObjectInputStream s) of the inner class SimpleDesktopCache$Cache. You try to disable expunge for the deserialization process.
1. The variable _expungeDisabled is null because deserialization is not finished -> There goes the NPE
2. There is no need to disable expunge before deserialization
3. You need to enable expunge after deserialization
My code recommendation for readObject(final java.io.ObjectInputStream s) would be:
SimpleDesktopCacheSerializationFix
private void readObject(final java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException { s.defaultReadObject(); disableExpunge(false); }
I hope this could help,
Greetings salbader