Вы можете добавить устаревшее поле типа Int32, а также иметь поле структуры. Создайте метод с атрибутом [OnDeserialized] (и правильными аргументами) и при некоторых обстоятельствах инициализируйте поле структуры из поля int, например, что поле int отлично от нуля, а структура имеет значение по умолчанию после десериализации, указывая, что данные являются из старого формата.
private int intValue; // Legacy field
private SomeStruct structValue; // New field
[OnDeserialized]
private void OnDeserialized(StreamingContext context)
{
if (intValue != 0)
{
// Old format, initialize struct with int value.
structValue = new SomeStruct(intValue);
}
}
Это не совсем элегантно, и есть другие способы, но если вы не возражаете против сохранения двух полей, это один из более простых способов. Обратите внимание, что в приведенном выше коде предполагается, что ноль указывает «пропущенное» значение для старого поля int.