Вы можете унаследовать свой класс от ISerializable и определить пользовательский GetObjectData. Я не проверял это, но такой класс может быть десериализуем из двоичного формата, даже если с тех пор в класс были внесены изменения.
EDIT
Я только что подтвердил, что это работает. Вы можете использовать код, как в примере ниже, чтобы явно определить, как объект сериализуется и десериализуется. Затем вы должны будете заставить эти методы работать со старыми версиями вашего класса. Я проверил это, сериализовав экземпляр Cereal в двоичный файл, затем внеся изменения в класс и считав файл обратно для десериализации.
[Serializable]
private class Cereal : ISerializable
{
public int Id { get; set; }
public string Name { get; set; }
public Cereal()
{
}
protected Cereal( SerializationInfo info, StreamingContext context)
{
Id = info.GetInt32 ( "Id" );
Name = info.GetString ( "Name" );
}
public void GetObjectData( SerializationInfo info, StreamingContext context )
{
info.AddValue ( "Id", Id );
info.AddValue ( "Name", Name );
}
}