BinaryFormatter在OnDeserializingMethod中确定对象的类型

时间:2018-08-31 20:51:48

标签: c# deserialization binaryformatter

我有一个非常复杂的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”方法中的数据?

0 个答案:

没有答案