blob: b188f6faaaf98daf25912ed5b79697aa24cef767 [file] [log] [blame]
----
Service Serialization
----
Service Serialization
Every once in a while you may need to serialize a service. For example, you may store an object into
the HttpSession that holds a reference to a service. In a clustered environment, that object will
be serialized and broadcast to other servers in the cluster.
Services in Tapestry are serializable. Specifically, service <proxies> are serializable.
Your service implementations <do not> have to be serializable.
Serialization works as follows:
* When a proxy is serialized, it instead serializes a <token> object.
* The token object is what's stored in the output stream.
* When the token is de-serialized, it locates the service proxy in the current Registry and returns that.
[]
The end result is very efficient: just the tiny tokens are serialized, not the services with their
proxies, configurations, implementations, dependencies, internal state and so forth.
Again, note that the actual service implementation is not serialized. Due to Tapestry's lazy creation policy,
the service implementation may not even exist. Since outside code only sees the proxy, there's no
difference.
Registry Resolution
The one trick here is locating the service proxy. Tapestry uses a <weak reference> to the Registry to do this.
When a Registry starts up, it is stored in the reference, so that de-serialization can work.
The reference is cleared when you shut down the Registry. If you stop using the Registry, but fail to
shut it down, the weak reference ensures that it will be released to the garbage collector anyway. Stil, you
should shutdown a Registry when done with it.
This all makes one BIG assumption: that there's just one Registry. That's normal for a web application, especially
when the tapestry-ioc JAR is included as part of the web application's WAR.
If you are running multiple Registries you will likely see errors in your console:
+---+
[ERROR] SerializationSupport Setting a new service proxy provider when there's already an existing provider. This may indicate that you have multiple IoC Registries.
+---+