Решение состоит в том, чтобы избежать несовместимых изменений ваших типов.
Взять, к примеру, SystemBObject. Вы описываете «версию 1» и «версию 2» этого типа, но они совсем не одного типа. Совместимое изменение для этого типа включает только Добавление свойств, а не изменение типа каких-либо существующих свойств. Ваше гипотетическое «Обновление версии» нарушило оба эти ограничения.
Следуя этому принципу, вы сможете избежать ВСЕХ проблем, которые вы описали.
Поэтому, если это ваше определение типа в версии 1
class SystemBObject{ // version 1
String key;
Integer year;
Integer month;
Integer day;
... // getters and setters etc;
}
Тогда это не может быть вашим определением типа в v2:
// version 2 - NO NO NO
class SystemBObject{
String key;
BDate date;
... // getters and setters etc;
}
... потому что он удалил существующие поля. Если это изменение, которое вам нужно сделать, это не новая «версия», это новый тип, который должен быть назван как таковой, как в коде, так и в формате сериализации.
Другой пример: если это ваш существующий тип v1:
class SomethingFromARequest {
Integer requestedId;
... // getters and setters etc;
}
... тогда это недопустимый "v2" этого типа:
class SomethingFromARequest {
Long requestedId;
... // getters and setters etc;
}
... потому что вы изменили тип существующего свойства.
Эти ограничения более подробно объясняются в основном технологически нейтральным способом в статье Microsoft по управлению версиями .
Кроме того, чтобы избежать этого источника несовместимости, вы можете и должны включить номер типа в тип. Это может быть простой серийный номер. Если у вас есть привычка регистрировать или проверять сообщения, а пропускная способность и пространство для хранения не являются проблемой, вы можете дополнить простое целое число UUID для идентификации экземпляра каждой уникальной версии типа.
Кроме того, вы можете создать прямую совместимость для ваших объектов передачи данных, используя слабую обработку и отображая «дополнительные» данные в «дополнительные» поля. Если XML является вашим форматом сериализации, вы можете использовать xsd: xmlAny или xsd: any и processContents = "lax" для захвата любых нераспознанных элементов схемы, когда служба v1 получает запрос v2 ( more ). Если ваш формат сериализации - JSON с более открытой моделью контента, то это бесплатно.