Обновление графа объекта BinaryFormatter - PullRequest
3 голосов
/ 10 мая 2011

В моем графе объектов у меня есть что-то вроде

[Serializable]
public class Dog 
{
     string _name;
}

, и у меня есть всевозможные списки собак и ссылки на собак.

Так как собака была только животным в началесоздание программного обеспечения, у меня не было необходимости в каком-либо базовом классе.Теперь эта потребность возникла, и теперь я хотел бы иметь

[Serializable]
public class Dog : Animal
{
    public void Bark() { }
}

[Serializable]
public class Cat : Animal
{
    public void DoTheCatStuff() { }
}

[Serializable]
public class Animal 
{
     string _name;
}

НО: когда я десериализирую СТАРЫЙ архив, у меня нет собак.Они вообще не десериализовались из архива.

Мне хотелось бы получить несколько советов о том, как это сделать.Если мне понадобится новая иерархия классов и вручную скопировать объекты из старого Dog в новый TheDog, хорошо, но я хотел бы избежать этого, если это возможно.

РЕДАКТИРОВАТЬ: Некоторые гуру .NET, ПОЧЕМУ неУ меня есть собаки?

Ответы [ 2 ]

1 голос
/ 10 мая 2011

Похоже, вам нужна реализация ISerializationSurrogate и немного SerializationBinder magic.Это очень хорошее обсуждение этого вопроса в старой MSDN Magazine .

0 голосов
/ 10 мая 2011

Это интересный;мой инстинктивный инстинкт состоит в том, чтобы сделать это:

Я написал бы программу обновления, которая имеет старый формат класса, который записывает ее в новый формат, или промежуточный формат, который вы можете затем понять и преобразовать в новый классИерархия.

Возможно, путем десериализации двоичного формата старого архива XML сериализует его, а затем, возможно, использует LinqToXml для создания объектов в новой иерархии.

...