Я немного изучил это, используя исходный код . Прежде всего следует отметить, что класс Hashtable
уже имеет некоторый контроль версии при сериализации / десериализации , поэтому, возможно, вам не нужно вводить свои собственные и искать причину проблемы где-то еще.
Теперь, переходя к вашему фактическому вопросу, исключение выбрасывается из метода OnDeserialization
, потому что SerializationInfoTable
пуст . И он пуст, потому что он заполняется только при вызове конструктора сериализации Hashtable(SerializationInfo info, StreamingContext context)
, который не вызывается при использовании суррогатов. SerializationInfoTable
является внутренним свойством во вложенном внутреннем классе, поэтому вы не можете много сделать с ним.
Что вы можете сделать, это создать унаследованный класс и переопределить GetObjectData
и OnDeserialization
, чтобы сделать твой материал там. Например,
[Serializable]
public class MyHashTable : Hashtable
{
private static SerializationInfo serializationInfo = null;
protected MyHashTable(SerializationInfo info, StreamingContext context) : base(info, context)
{
}
public MyHashTable() : base()
{
}
public override void GetObjectData(SerializationInfo info, StreamingContext context)
{
base.GetObjectData(info, context);
info.AddValue("MyVersion", 0, typeof(int));
serializationInfo = info;
}
public override void OnDeserialization(object sender)
{
base.OnDeserialization(sender);
var myVersion = serializationInfo.GetValue("MyVersion", typeof(string));
Console.WriteLine($"MyVersion: {myVersion}");
}
}
}
Надеюсь, что это поможет.