tomcat-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From s...@brm.com
Subject RE: Session Serialize code
Date Fri, 29 Dec 2000 01:47:53 GMT
Hi,

I can't see ServerSession.writeObject (and readObject) there.
You must have code which is ServerSession aware, since SeverSession member
ssm (point to its manager) is not serializeable.

Here is jon's original code (3.2.1): This must be fixed to be 3.3
compatible. I can do that (it's really easy), but I don't know how to handle
the HttpSessionBindingEvent (in writeObject) below (It seems that
ServerSession can't cast to HttpSession).

Please let me know if you think this is un-needed.

    /**
     * Read a serialized version of this session object from the specified
     * object input stream.
     * <p>
     * <b>IMPLEMENTATION NOTE</b>:  The reference to the owning Manager
     * is not restored by this method, and must be set explicitly.
     *
     * @param stream The input stream to read from
     *
     * @exception ClassNotFoundException if an unknown class is specified
     * @exception IOException if an input/output error occurs
     */
    private void readObject(ObjectInputStream stream)
		throws ClassNotFoundException, IOException {

		// Deserialize the scalar instance variables (except
Manager)
		creationTime = ((Long) stream.readObject()).longValue();
		id = (String) stream.readObject();
		lastAccessedTime = ((Long) stream.readObject()).longValue();
                thisAccessedTime = ((Long) stream.readObject()).longValue();
		maxInactiveInterval = ((Integer)
stream.readObject()).intValue();
		isNew = ((Boolean) stream.readObject()).booleanValue();
		isValid = ((Boolean) stream.readObject()).booleanValue();

		attributes = (Hashtable) stream.readObject();
    }


    /**
     * Write a serialized version of this session object to the specified
     * object output stream.
     * <p>
     * <b>IMPLEMENTATION NOTE</b>:  The owning Manager will not be stored
     * in the serialized representation of this Session.  After calling
     * <code>readObject()</code>, you must set the associated Manager
     * explicitly.
     * <p>
     * <b>IMPLEMENTATION NOTE</b>:  Any attribute that is not Serializable
     * will be silently ignored.  If you do not want any such attributes,
     * be sure the <code>distributable</code> property of our associated
     * Manager is set to <code>true</code>. 
	 * <p>
     * <b>IMPLEMENTATION NOTE</b>: If we can't serialize the object stored
in 
     * the session, then check to see if it implements 
     * HttpSessionBindingListener and then call its 
     * valueUnbound method, allowing it to save its state
     * correctly instead of just being lost into the etherworld
     *
     * @param stream The output stream to write to
     *
     * @exception IOException if an input/output error occurs
     */
    private void writeObject(ObjectOutputStream stream) throws IOException {

		// Write the scalar instance variables (except Manager)
		stream.writeObject(new Long(creationTime));
		stream.writeObject(id);
		stream.writeObject(new Long(lastAccessedTime));
                stream.writeObject(new Long(thisAccessedTime));
		stream.writeObject(new Integer(maxInactiveInterval));
		stream.writeObject(new Boolean(isNew));
		stream.writeObject(new Boolean(isValid));

        if (attributes.size() > 0) {
			// Accumulate the names of serializable attributes
			Hashtable results = new
Hashtable(attributes.size());
        
			for (Enumeration e = attributes.keys();
e.hasMoreElements() ; ) {
				String key = (String) e.nextElement();
				Object value = attributes.get(key);
				if (value instanceof Serializable) {
					results.put(key, value);
				}
				// if we can't serialize the object stored
in 
				// the session, then check to see if it
implements 
				// HttpSessionBindingListener and then call
its 
				// valueUnbound method, allowing it to save
its state
				// correctly instead of just being lost into
the etherworld
				else if (value instanceof
HttpSessionBindingListener ) {
					try {
	
((HttpSessionBindingListener)value)
						.valueUnbound(new
HttpSessionBindingEvent(this, key));
					} catch (Exception f) {
						// ignored
					}
				}
			}
			stream.writeObject(results);
		} else {
			stream.writeObject(new Hashtable());
		}
	}
}



--Shai

-----Original Message-----
From: cmanolache@yahoo.com [mailto:cmanolache@yahoo.com]
Sent: Friday, December 29, 2000 03:24
To: tomcat-dev@jakarta.apache.org
Cc: cmanolache@yahoo.com
Subject: Re: Session Serialize code

Hi Shai,

Mea culpa :-)

I moved Jon's code to org.apache.tomcat.util.ObjectSerializer
( I removed all dependencies to Session or tomcat internals - it should
work for any serializable object ).

( my intentions were to make it more reusable and to reuse it in reloading
context attributes, etc - there are other objects that might get lost in
a server reload ).

Let me know if you can use it in this form, and I can certainly add it
back.

Costin



> Hi Costin,
>
> As discussed a week ago, someone took out Jon's code to serialize session
> from 3.3.
> That code was part of 3.2 but does not exist in 3.3. Could you please add
it
> back into ServerSession??
>
> As proposed by you I'm working on "SerializableSession" module, and I need
> that piece of code to serialize sessions.
>
> (Functions: writeObject, readObject)
> Thx.
>
> ________________________
> Shai Fultheim
> Chief Technology Officer
> BRM Group
> 
> E-Mail: shai@brm.com
> Mobile: 972-53-866-459
> Office: 972-2-5891-459
>

Mime
View raw message