У меня есть метод десериализации (украшенный атрибутом [OnDeserialized()]
), который я хочу переопределить в производном классе. Когда я пытаюсь сделать это, я получаю следующую ошибку времени выполнения:
Необработанное исключение типа "System.TypeLoadException".... Тип "BaseObj" в сборке... имеет метод "OnDeserialization", который является либо статическим, либо виртуальным, либо абстрактным, либо обобщенным, но помечен как метод обратного вызова сериализации.
Я не смог найти документацию, подтверждающую это ограничение на обратные вызовы сериализации (кроме самого сообщения об ошибке). Может ли кто-нибудь объяснить это странное ограничение?
Исходя из предложения в комментарии здесь, я прибегал к вызову отдельной виртуальной функции из метода OnDeserialization следующим образом:
[Serializable()]
public class BaseObj
{
protected string obj { get; set; }
[OnDeserialized()]
public void OnDeserializedMethod(StreamingContext context)
{
//call the virtual method because deserialization callbacks can’t be virtual
onDeserialized(context);
}
virtual protected void onDeserialized(StreamingContext context)
{
obj = "This value was deserialized by the base class.";
}
}
[Serializable()]
public class DerivedObj : BaseObj
{
override protected void onDeserialized(StreamingContext context)
{
obj = "This value was deserialized by the derived class.";
}
}
Кажется, что это работает нормально, но кажется, скорее, "kludgey". Это мой единственный вариант? Почему метод обратного вызова сериализации не может быть виртуальным?