Встроенная сериализация .net является дополнительной опцией, но она требует, чтобы вы добавляли заполнители для определенных частей, которые вы хотите расширить в будущем.
Вы добавляете заполнители для дополнительных элементов / атрибутов, например, следующий код:
[XmlAnyElement()]
public XmlElement[] ExtendedElements { get; set; }
[XmlAnyAttribute()]
public XmlAttribute[] ExtendedAttributes { get; set; }
Добавляя вышеупомянутое в соответствующие классы, вы можете эффективно читать сохраненную информацию, которая имеет дополнительные элементы / атрибуты, изменять обычные свойства, которые программа знает, как обрабатывать, и сохранять ее. Это учитывает как обратную, так и прямую совместимость. При добавлении нового поля просто добавьте желаемое свойство.
Обратите внимание, что вышеперечисленное ограничено расширением в указанных крючках.
Обновление: Как упоминал Джон в комментарии, приведенное выше будет работать только для сериализации xml. Насколько я знаю, двоичная сериализация не поддерживает нечто подобное. В двоичной сериализации вы можете получить как старую / новую версию приложения, чтобы иметь возможность читать сериализованную информацию друг друга (.net 2.0+), но если вы сохраните ее обратно, вы потеряете дополнительную информацию, которую версия не обрабатывает.
Начиная с .net 2.0, процесс десериализации игнорирует дополнительные данные, если вы объедините их с необязательными полями, вы можете эффективно заставить оба приложения читать форматы других версий. Проблема в том, что данные не удерживаются классом, как в полях xml.
Некоторые ссылки: http://msdn.microsoft.com/en-us/library/system.runtime.serialization.serializationbinder.aspx, http://msdn.microsoft.com/en-us/library/ms229752.aspx
Если вы не хотите сериализации XML, я бы пошел с подходом Джона.
Ps. Я не знаю, есть ли какая-нибудь хорошая сторонняя реализация, к которой мы можем получить доступ, которая расширяет двоичную сериализацию для хранения и сохранения дополнительных данных.