2012-01-18 4 views
1

У меня есть класс, который я больше не хочу использовать. Я создал базовый класс и сделал мой устаревший класс дочерним по отношению к новому базовому классу.Удалить DataMember, создав новый базовый класс и переустановив производный класс

По-разному, единственное различие между двумя классами - это одно свойство DataMember.

У меня есть класс, который имеет свойство, которое ссылается на производный класс в свойстве (также DataMember). Я заменил этот тип базовым типом.

При десериализации я получаю сообщение об ошибке Deserialized object с ссылочным идентификатором iXX, который не найден в потоке.

Если я перенес DataMember из моего производного класса в базовый класс. Исключение уходит.

Я знаю, что я не могу изменить DataContract. Я надеялся создать новый класс и позволить другому, устаревшему классу со временем падать.

Могу ли я это сделать? Почему я получаю это исключение?

* EDIT: Похоже, что элемент xml имеет атрибут типа при наследовании. Я предполагаю, что поэтому десериализация терпит неудачу.

** EDIT:

Serialize с этим:

[DataContract(IsReference = true)] 
public class DerivedType  
{ 
    [DataMember] 
    public Dictionary<object,object> DataMemberThatIDoNotNeed { get; set; } 
} 

[DataContract(IsReference = true)] 
public class Class1 
{ 
    [DataMember] 
    //Previously was DerivedType before BaseType was introduced 
    public DerivedType MyBaseType { get; set; }  
} 

Затем десериализации с этим:

[DataContract(IsReference = true)] 
[KnownType(typeof(DerivedType))] 
public class BaseType 
{ 

} 

[DataContract(IsReference = true)]  
public class DerivedType : BaseType 
{ 
    [DataMember] 
    public Dictionary<object,object> DataMemberThatIDoNotNeed { get; set; } 
} 

[DataContract(IsReference = true)] 
public class Class1 
{ 
    [DataMember] 
    //Previously was DerivedType before BaseType was introduced 
    public BaseType MyBaseType { get; set; } 
} 
+0

Похоже, что ваша собственность является обязательной частью контракта. – Tejs

+0

Почему бы просто не отметить его как устаревший и создать новый API с классом, который принимает старый класс как параметр конструктора? http://msdn.microsoft.com/en-us/library/system.obsoleteattribute.aspx – Lloyd

+0

DataMembers не следует удалять из существующего DataContract. Вот почему я создал новый базовый класс и пометил старый, производный класс устаревшим. Я также обновил любые данные старого типа для ссылки на новый базовый тип. –

ответ

0

Ну, я выполнил следующий код с вашими объектами:

var class1 = new Class1 {MyBaseType = new DerivedType()}; 

var serializer = new DataContractSerializer(typeof (Class1)); 
serializer.WriteObject(File.Create(filename), class1); 

Затем я изменил Class1 на:

[DataContract(IsReference = true)] 
public class Class1 
{ 
    [DataMember] 
    public DerivedType MyBaseType { get; set; } 
} 

и следующий код все еще работает:

var readObject = new DataContractSerializer(typeof (Class1)).ReadObject(File.OpenRead(filename)); 

readObject.Should().NotBeNull(); // it is not null 

Может быть, вам нужно показать код сериализации, чтобы добавить больше конкретики.

+0

Class1 должен использовать DerivedType для запуска, и вам нужно загрузить свойство DataMemberThatIDoNotNeed с некоторыми данными. Затем измените с DerivedType на BaseType и десериализуйте Сериализация из ранее. Он должен сломаться. –

+0

Я изменил код, чтобы показать классы при сериализации, а новые/модифицированные классы при десериализации –

+0

это не в моем случае :) –

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