Basically, we mark all local serialization operations the same way you would mark a transaction. LOCAL to LOCAL SERIALIZATION Definition: This is a full serialization/deserialization takes place in the local vm inside the marked scope of the IntraVM server. Circumstances: When an IntraVM implementation of a javax.ejb.* interface is serialized in the scope of a local IntraVM serialization. These serializations happen when objects are passed as parameters or return values from one client/ejb to another client/ejb running inside the same VM. Action: Temporarily cache the instance in memory during serialization, retrieve again during deserialization. Example Scenario: BEFORE SERIALIZATION 1. Call IntraVmCopyMonitor.preCopyOperation(). 2. Method parameters are sent to ObjectOutputStream. SERIALIZATION 3. ObjectOutputStream encounters an IntraVmMetaData instance in the object graph and calls its writeReplace method. 4. The IntraVmMetaData instance determines it is being serialized in the scope of an IntraVM serialization by calling IntraVmCopyMonitor.isIntraVmCopyOperation(). 5. The IntraVmMetaData instance creates an IntraVmArtifact that caches it in a static hashtable keyed on a combination of the thread id and instance hashCode. 6. The IntraVmMetaData instance returns the IntraVmArtifact instance from the writeReplace method. 7. The ObjectOutputStream serializes the IntraVmArtifact instance in place of the IntraVmMetaData instance. DESERIALIZATION 8. ObjectInputStream encounters and deserializes an IntraVmArtifact instance and calls its readResolve method. 9. The IntraVmArtifact instance uses the key it created in step 5 to retrieve the IntraVmMetaData instance from the static hashtable. 10. The IntraVmArtifact instance returns the IntraVmMetaData instance from the readResolve method. 11. ObjectInputStream places the IntraVmMetaData instance in the object graph in place of the IntraVmArtifact instance. AFTER 12. Method parameters are no de-referenced as mandated by the spec and can be passed into the bean's method. 13. IntraVmCopyMonitor.postCopyOperation() is called, ending the local IntraVm serialization scope. LOCAL to REMOTE SERIALIZATION Definition: This is a serialization that initiates in the local vm, but is outside the scope of a marked IntraVM local serialization. Circumstances: When an IntraVM implementation of a javax.ejb.* interface is serialized outside the scope of the IntraVM Server These serializations happen when objects are sent from a local bean to a remote client as part of a return value, or when a stateful session bean is passified. Action: Don't serialize the IntraVM javax.ejb.* interface implementation, instead ask the ApplicationServer to nominate its own implementation as a replacement. This is done via the org.openejb.spi.ApplicationServer interface. Example Scenario: SERIALIZATION 1. ObjectOutputStream encounters an IntraVmMetaData instance in the object graph and calls its writeReplace method. 2. The IntraVmMetaData instance determines it is being serialized outside the scope of an IntraVM serialization by calling IntraVmCopyMonitor.isIntraVmCopyOperation(). 3. The IntraVmMetaData instance calls the getEJBMetaData method on the ApplicationServer. 4. The IntraVmMetaData instance returns the ApplicationServer's EJBMetaData instance from the writeReplace method. 5. The ObjectOutputStream serializes the ApplicationServer's EJBMetaData instance in place of the IntraVmMetaData instance. Note: The ApplicationServer's EJBMetaData instance can be any object that implements the javax.ejb.EJBMetaData interface and can also implement any serialization methods, such as the writeReplace method, to nominate a replacement or implement protocol specific logic or otherwise gain control over the serialization of EJBMetaData instances destined for its remote clients. DESERIALIZATION The deserialization of the Application Server's javax.ejb.* implementations is implementation specific. REMOTE to LOCAL SERIALIZATION Definition: This is a full serialization/deserialization takes place in the local vm inside the marked scope of the IntraVM server. Circumstances: When an IntraVM implementation of a javax.ejb.* interface is serialized in the scope of a local IntraVM serialization. These serializations happen when objects are passed as parameters or return values from one client/ejb to another client/ejb running inside the same VM. REMOTE to LOCAL SERIALIZATION Definition: This is a serialization that initiates in a remote client vm and finishes in same vm as the Application Server. Circumstances: When an ApplicationServer-specific implementation of a javax.ejb.* interface is serialized outside the scope of the client vm and deserializes in the Application Server and OpenEJB IntraVM Server's vm. These serializations happen, for example, when javax.ejb.* objects are used as parameters to an EJBObject method either directly or nested in another object. Action: No special action is required by the OpenEJB specification. Notes on Optimization: For optimization purposes, the ApplicationServer can replace its javax.ejb.* interface implementations with those created by the IntraVM Server. The Application Server may wish to this by implementing the serialization readResolve method in it's javax.ejb.* implementations. Then, when these implementations are deserialized, certain checks can be made to determine if they in the same VM as the Application Server and OpenEJB IntraVM Server. If they are, it can replace itself with the equivalent IntraVM Server implementation. An easy way for an implementation to determine which VM it is in is to simply set a system variable that is only present in the Application Server's VM. This is identical to how the IntraVM Server replaces its javax.ejb.* interface implementations with those created by the ApplicationServer when objects are leaving the local VM.