Re: Serialization of datacontext

From: bob (sabob..mail.com)
Date: Mon Jun 04 2007 - 04:46:14 EDT

  • Next message: Andrus Adamchik: "Re: Serialization of datacontext"

    Hi

    I debugged this a bit and notice the following:

    on DataContext serialization the following code is executed in
    writeObject(ObjectOutputStream)

             ...
             // Serialize local snapshots cache
             if (!isUsingSharedSnapshotCache()) {
                 out.writeObject(objectStore.getDataRowCache());
             }
             ...

    So if useSharedCache is false, the ObjectStore's DataRowStore is also
    serialized.

    DataRowStore's reference to EventManager is transient and not
    serialized. So upon deserialization, when DataRowStore is read back
    in, the EventManager is null and this caused the exception below.

    What is the best way to fix this? EventManager should not be
    transient? Or a new EventManager should be created in
    DataRowStore.readObject(ObjectInputStream)?

    regards

    bob

    bob wrote:
    > Hi all
    >
    > Using cayenne 1.2.3 and jdk 1.5 on Windows XP.
    >
    > Sometimes while developing with Tomcat I get the following exception.
    > Seems to happen on serialization of DataContext along with the session.
    > Below the exception is a little test class to reproduce this. Note that
    > if useSharedCache = true, then there is no exception. Should I open a
    > JIRA issue or is this expected behavior?
    >
    >
    > Exception in thread "main"
    > org.objectstyle.cayenne.CayenneRuntimeException: [v.1.2.3 May 6 2007]
    > Commit Exception
    > org.objectstyle.cayenne.access.DataContext.flushToParent(DataContext.java:1290)
    >
    > org.objectstyle.cayenne.access.DataContext.commitChanges(DataContext.java:1166)
    >
    > test.SerializeDCTest.main(SerializeDCTest.java:29)
    >
    > Caused by: java.lang.NullPointerException
    > org.objectstyle.cayenne.access.DataRowStore.sendUpdateNotification(DataRowStore.java:709)
    >
    > org.objectstyle.cayenne.access.DataRowStore.processSnapshotChanges(DataRowStore.java:574)
    >
    > org.objectstyle.cayenne.access.DataDomainFlushAction.postprocess(DataDomainFlushAction.java:278)
    >
    > org.objectstyle.cayenne.access.DataDomainFlushAction.flush(DataDomainFlushAction.java:178)
    >
    > org.objectstyle.cayenne.access.DataDomain.onSyncFlush(DataDomain.java:846)
    > org.objectstyle.cayenne.access.DataDomain$2.transform(DataDomain.java:817)
    > org.objectstyle.cayenne.access.DataDomain.runInTransaction(DataDomain.java:872)
    >
    > org.objectstyle.cayenne.access.DataDomain.onSync(DataDomain.java:814)
    > org.objectstyle.cayenne.access.DataContext.flushToParent(DataContext.java:1262)
    >
    >
    >
    > package test;
    >
    > public class SerializeDCTest {
    >
    > public SerializeDCTest() {
    > }
    >
    > public static void main(String[] args) {
    > //boolean useSharedCache = true; //works
    > boolean useSharedCache = false;
    > DataContext context =
    > DataContext.createDataContext(useSharedCache);
    > context = serializeDC(context);
    > Employee emp = (Employee) DataObjectUtils.objectForPK(context,
    > Employee.class, 740);
    > emp.setFirstname("test" + Math.random());
    > context.commitChanges();
    > }
    >
    > public static DataContext serializeDC(DataContext dc) {
    > try {
    > ByteArrayOutputStream bos = new ByteArrayOutputStream();
    > ObjectOutputStream oos = new ObjectOutputStream(bos);
    > oos.writeObject(dc);
    >
    > ByteArrayInputStream is = new
    > ByteArrayInputStream(bos.toByteArray());
    > ObjectInputStream ois = new ObjectInputStream(is);
    > DataContext result = (DataContext) ois.readObject();
    > return result;
    >
    > } catch (Exception ex) {
    > throw new RuntimeException("DataContext serialization
    > failed", ex);
    > }
    > }
    > }
    >
    >
    > kind regards
    >
    > bob
    >
    >



    This archive was generated by hypermail 2.0.0 : Mon Jun 04 2007 - 04:59:02 EDT