Re: Reconnecting serialized DataObjects

From: Andrus Adamchik (andru..bjectstyle.org)
Date: Mon Sep 26 2005 - 18:03:59 EDT

  • Next message: Andrus Adamchik: "Re: Reconnecting serialized DataObjects"

    Hmm... This code will result in duplicate objects in the same context.

    But the default behavior should work in a generic clustering scenario
    - Cris is right about it - i.e. if your object serialization occurs
    as a consequence of session serialization. In this case DataContext
    is also serialized in the same sweep, so on de-serialization all
    objects are pulled back automatically and you don't have to
    "reconnect" them.

    Actually I never got back to investigating CAY-298, as this became
    less of a priority to me personally, but I assume in Tapestry
    problems occured when restoring objects stored explicitly via some
    other serialization mechanism that doesn't involve storing the
    DataContext...

    My solution for that (I haven't tried it yet) was to rely on thread
    DataContext during de-serialization and substitute deserialized
    object clone with an object from that DataContext using
    'readResolve'. This would minimize the serialized footprint and
    maintain uniquing.

    I use the same approach (albeit custom-coded) in my web applications:
    entity name + int id + thread DataContext is all I need to get an
    object from request.

    Andrus

    On Sep 23, 2005, at 1:24 PM, Mike Kienenberger wrote:

    > What are others doing to handle reconnecting serialized DataObjects
    > back to a DataContext?
    >
    > My current situation is that JSF serializes all of my DataObjects
    > between requests, and I'm using this code to restore them. However, I
    > suspect this code doesn't properly handle the case where the data
    > context may change.
    >
    > Kevin's thread "CayenneDataObject#setDataContext()" has me worried
    > that I need to do more than what I'm currently doing.
    >
    > [In the code below, currentDataContext may or may not be the original
    > DataContext, although I think my dataContext has remained unchanged so
    > far.]
    >
    > public void reconnect(Object object)
    > {
    > if (null == object) return;
    >
    > if (false == (object instanceof DataObject))
    > throw new
    > IllegalArgumentException(object.getClass().getName() + " is not a
    > DataObject.");
    >
    > DataObject dataObject = (DataObject)object;
    >
    > if (null != dataObject.getDataContext()) return;
    >
    > dataObject.setDataContext(currentDataContext);
    >
    > EntityResolver entityResolver =
    > currentDataContext.getEntityResolver();
    > ObjEntity objEntity = entityResolver.lookupObjEntity
    > (dataObject);
    >
    > // initialize to-many relationships with a fault
    > Iterator it = objEntity.getRelationships().iterator();
    > while (it.hasNext()) {
    > ObjRelationship rel = (ObjRelationship) it.next();
    > if (rel.isToMany()) {
    > dataObject.writePropertyDirectly(rel.getName(),
    > Fault.getToManyFault());
    > Object relObject =
    > dataObject.readPropertyDirectly(rel.getName());
    > if (relObject instanceof List)
    > {
    > List relList = (List)relObject;
    > Iterator relObjectIterator = relList.iterator();
    > while (relObjectIterator.hasNext())
    > {
    > DataObject relDataObject = (DataObject)
    > relObjectIterator.next();
    > reconnect(relDataObject);
    > }
    > }
    > }
    > else
    > {
    > Object relObject =
    > dataObject.readPropertyDirectly(rel.getName());
    > if (relObject instanceof DataObject) reconnect
    > (relObject);
    > }
    > }
    > }
    >
    >



    This archive was generated by hypermail 2.0.0 : Mon Sep 26 2005 - 18:04:01 EDT