Hi Devs, We are heavily using serialization to store context/runtime data throughout Stratos, and we depend on the default serialization mechanism provided by Java. The downside of this is if a Serialized class is changed (adding/removing a non-transient and non-static class variables), we cannot use any data serialized with the older version of the same class. The only option in this case is to start with a new deployment of Stratos.
Currently since we are using the default serialization/deserialization capabilities by implementing Java Serializable interface, we have no control over this process. But, if we implement Externalizable [1] interface, we actually can have some control over the serialization/deserialization. With this, its the responsibility of the implementing class to maintain the serialization/deserialization logic. To maintain the backward compatibility of serialized data, AFAIU we can do the following: - Maintain a version for serialized classes (ex.: CloudControllerContext - version 4.1.4) - Write our own serialization/deserialization logic, depending on the version - If a change occurs to the class such that previously deserialized data can not be used (adding a non-transient member to the class, etc.), increment the version of the relevant class and modify the deserialization logic as shown in [2] Therefore, even in there is a change to the class signature, still the already serialized data can be de-serialized from the previous version. I did a quick PoC for custom serialization and deserialization using CloudControllerContext class, which worked fine. There are few downsides of this approach though: 1. Maintain our own serialization/deserialization logic, requires updating if a change occurs in the relevant classes 2. The Externalizable interface requires a default non argument Constructor to work, and that will require some design changes (since we have private/non-default constructors in a few singleton Context classes) wdyt? [1]. https://docs.oracle.com/javase/7/docs/api/java/io/Externalizable.html [2]. if ("4.1.4".equals(CC_CONTEXT_VERSION)) { // de-serialize members in 4.1.4 version } else if ("4.1.5".equals(CC_CONTEXT_VERSION)) { // de-serialize members in 4.1.5 version } -- Thanks and Regards, Isuru H. +94 716 358 048* <http://wso2.com/>*