2011-05-10 5 views
3

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

[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; 
} 

НО: когда я десериализация старого архива, у меня нет никаких собак. Они вообще не десериализировались из архива.

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

EDIT: Некоторые гуру .NET, ПОЧЕМУ У меня нет собак?

+0

Я проверил простой тест с BinaryFormatter (сериализовать, изменить определение класса, десериализовать) с помощью кода выше, и я не видел никаких проблем. Вы уверены, что этот код является проблемой? –

+0

Попробуйте добавить список к графу объектов ... –

+0

@ Даниэль, я повторил со списком , но все равно не смог воспроизвести. –

ответ

0

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

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

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

+0

В настоящее время я делаю апгрейды таким образом, что я поддерживаю int _serial в корне графа и делаю что-то, когда серийный номер не является самым новым. До сих пор (18 месяцев, 10 сайтов, 20-ти обновлений) не было необходимости в процедуре внешнего обновления ... –

+0

Так же является подклассификация «собаки» совсем недавно, что вызвало эту проблему? Мне интересно, могут ли некоторые из атрибутов «толерантной версии сериализации» помочь, добавив обратный вызов для обработки значения: http://msdn.microsoft.com/en-us/library/ms229752(v=vs.80) .aspx –

+0

Я использую .net2.0, и этот документ говорит, что он не обрабатывает атрибут VersionAdded. Во всяком случае, я не придерживался руководящих принципов из статьи и до сих пор не имел никаких проблем с сериализацией (de). –

Смежные вопросы