BinaryFormatter определяет тип объекта в OnDeserializingMethod - PullRequest
0 голосов
/ 31 августа 2018

У меня очень сложный объект 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"?

...