У меня очень сложный объект csla. Этот объект был сериализован в базу данных в двоичном виде. Один из дочерних объектов изменяется, и я больше не могу десериализовать объект. (Когда я пытаюсь десериализовать его, свойства содержат мусор или не инициализируются, потому что десериализация не работает в новом классе.) Я опубликую упрощенный пример здесь.
[serializable]
public class Head : BusinessBase<Head>
{
private static PropertyInfo<int> _eyesCountProperty = RegisterProperty<int>(new PropertyInfo<int>("EyesCount"));
public int EyesCount
{
get { return GetProperty(_eyesCountProperty ); }
set { SetProperty(_eyesCountProperty , value); }
}
}
[serializable]
public class Person : BusinessBase<Person>
{
private static PropertyInfo<string> _firstNameProperty = RegisterProperty<string>(new PropertyInfo<string>("FirstName"));
public string FirstName
{
get { return GetProperty(_firstNameProperty ); }
set { SetProperty(_firstNameProperty , value); }
}
}
public Head MyHead { get; set; }
}
Допустим, у меня есть экземпляр класса Person, и я сериализую его в базу данных.
Вот наши методы сериализации и десериализации.
public static byte[] ConvertToByteArray(object theObject)
{
byte[] result = null;
BinaryFormatter bf = new BinaryFormatter();
using(MemoryStream ms = new MemoryStream())
{
bf.Serialize(ms, theObject);
result = ms.ToArray();
}
return result;
}
public static object ConvertFromByteArray(byte[] serializedObject)
{
object result = null;
using(MemoryStream ms = new MemoryStream(serializedObject))
{
BinaryFormatter bf = new BinaryFormatter();
result = bf.Deserialize(ms);
}
return result;
}
Теперь предположим, что класс Head изменился, и теперь у меня в нем есть noseCount и mouthCount. Поэтому я пытаюсь переименовать его в «HeadV1» и создать класс «HeadV2» с новыми свойствами в нем. (Мне нужно было бы сделать класс PersonV1 со свойством HeadV1 и класс PersonV2 с HeadV2.)
В классе PersonV2 я хотел бы иметь метод "OnDeserializing", который позволил бы мне знать, имеет ли элемент, который я пытаюсь десериализовать, тип "PersonV1" или "PersonV2", чтобы десериализовать его правильным способом .
[OnDeserializing()]
internal void OnDeserializingMethod(StreamingContext context)
{
// Determine if data is of type "PersonV1" or "PersonV2"
}
Но я застрял, я не знаю, как это сделать, и я не могу найти, как это сделать. Есть ли способ сделать это? Кажется, у меня нет доступа к данным внутри метода "OnDeserializing"?