我有一个非常复杂的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类发生了变化,现在我有了鼻子计数和嘴部计数。因此,我尝试将其重命名为“ HeadV1”,并在其中创建具有新属性的“ HeadV2”类。 (我需要使用“ HeadV1”属性创建一个“ PersonV1”类,并使用“ HeadV2”创建一个“ PersonV2”类。)
在PersonV2类中,我想有一个“ OnDeserializing”方法,该方法可以让我知道我要反序列化的项目是“ PersonV1”还是“ PersonV2”类型,以便以正确的方式反序列化
[OnDeserializing()]
internal void OnDeserializingMethod(StreamingContext context)
{
// Determine if data is of type "PersonV1" or "PersonV2"
}
但是我被困住了,我不知道该怎么做,而且我似乎也找不到如何做。有什么办法吗?我似乎无法访问“ OnDeserializing”方法中的数据?