Sed and mismatches
Let's find out how to fix mismatches when retrieving a serialized objects.
Contents
What is a mismatch?
Before trying to find out how to fix a mismatch we need to provide a definition. A mismatch is whenever the layout or description of a type has changed compared to what was stored. Currently you have the following type of mismatches:
- The class version has changed
- An attribute has been added or removed
- An attribute had its type changed
Some mismatch can be silently resolved (see below) and some requires an explicit action from the user to map the old data to the new.
Fixing type name mismatches
The first kind of mismatches that can occur is when a type was renamed or a generic parameters was either added or removed. If you know the old name and the new name, you can pass to {SED_RECOVERABLE_DESERIALIZER}.set_class_type_translator
an agent that will return the new type name given the old type name. This agent will be called each time we cannot find the name in the retrieving system.
When all types have found their corresponding type name, we can continue and solve attribute type/name mismatches.
Fixing attribute type/name mismatches
There are various kind of mismatches:
- The type of the attribute was changed from X to Z. There are different scenarios:
- The old type conforms to the new type: if
{SED_RECOVERABLE_DESERIALIZER}.is_conforming_mismatch_allowed
is true, then no mismatch is reported, otherwise we report one which will be handled when retrieving the object data. - The types differ only by their attachment mark: if the new type is attached while the other is not, then we will only trigger a mismatch when retrieving the object data when we get Void; otherwise no mismatch is being raised.
- If the old type without attachment mark conforms to the new type without attachment mark, we apply first #1 and if True we apply #2 above.
- The types are completely unrelated: we trigger a mismatch when retrieving the object data.
- The old type conforms to the new type: if
- The name of some attributes have changed: if an attribute name translator has been provided via
{SED_RECOVERABLE_DESERIALIZER}.set_attribute_name_translator
, we use this to find out the new name of the attribute and then apply the above in case the type has also changed. If no translator was provided, we simply trigger a mismatch when retrieving the object data.
- Some attributes have been removed: if
{SED_RECOVERABLE_DESERIALIZER}.is_attribute_removal_allowed
is true, then no mismatch is reported, otherwise we report one which will be handled when retrieving the object data.
Fixing mismatch with data
When none of the above was able to automatically address the various mismatches, we trigger a mismatch whenever we are done retrieving an object which has a mismatch.
This is done by calling the correct_mismatch
routine from the type which has the mismatch. From that routine, you can have access to an instance of SED_TYPE_MISMATCH
and MISMATCH_INFORMATION
holding all the information you need to know what is mismatched and all the object data you need to reconnect the attributes.
If you are unable to fix, then you should raise an exception which will be internally understood as not being able to retrieve the storable. At this stage, you can either choose to continue retrieving the rest of the data or stop right there by setting {SED_RECOVERABLE_DESERIALIZER}.is_stopping_on_data_retrieval_error
.
Open issue
The issue is related to the handling of missing values for attached types. When retrieving an object if an attached attribute has no value, the attribute cannot be used within the execution of `correct_mismatch'. Thus we need a special compiler support so that in `correct_mismatch' attached attributes are considered not set. But this is not enough, if you depend on a attribute which also has a mismatch which haven't been fixed yet, you cannot assume anything about the attachment status of its attributes. This constraint has to be limited to the type checking of `correct_mismatch'.