Рассмотрим следующий тип POD класса:реализации ISerializable для контроля версий
public class Price { public decimal OfferPrice { get; set; } }
объекты этого класса извлекаются с сервера, так что давайте украсить его сериализуемого
[Serializable]
public class Price { public decimal OfferPrice { get; set; } }
Теперь есть два клиента на различные машины получают эти объекты. Они не будут отправлять цены. Все они получают копию сборки Price.
Теперь класс расширен с помощью BonusPrice.
[Serializable]
public class Price {
public decimal OfferPrice { get; set; }
public decimal BonusPrice { get; set; }
}
Новая сборка развернута на сервере, одному из клиентов, но НЕ другому. Таким образом, старый клиент с версией будет сбой при (де) сериализации объектов Price.
Клиент со старой версией не нуждается в поле BonusPrice, поэтому было бы неплохо, что он продолжает работать, когда есть разница в версии. Поэтому я имею в виду реализации ISerializable с самого начала, так что первая и вторая версия будет выглядеть так:
// version 1.0
[Serializable]
public class Price : ISerializable {
protected Price(SerializationInfo info, StreamingContext context) {
OfferPrice = info.GetDecimal("op");
}
[SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)]
public virtual void GetObjectData(SerializationInfo info, StreamingContext context) {
info.AddValue("op", OfferPrice);
}
}
// version 2.0
[Serializable]
public class Price : ISerializable {
protected Price(SerializationInfo info, StreamingContext context) {
OfferPrice = info.GetDecimal("op");
BonusPrice = info.GetDecimal("bp");
}
[SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)]
public virtual void GetObjectData(SerializationInfo info, StreamingContext context) {
info.AddValue("op", OfferPrice);
info.AddValue("bp", BonusPrice);
}
}
Так что теперь, когда один клиент не обновляется до версии 2 он будет по-прежнему держать на десериализации только OfferPrice и не сбой. Когда он будет обновлен в какой-то момент, он автоматически использует BonusPrice.
Мой вопрос: реализует ISerializable хороший способ управления версиями при чтении объектов? Как обычно решаются эти проблемы?
Хороший вопрос. Как я уже упоминал в своем ответе, что вы можете использовать 'OptionalFieldAttribute', я никогда не использовал его, потому что было слишком поздно, когда я узнал что-то подобное. FWIW Я использовал 'ISerializable' только для управления версиями в моих проектах. –