У меня есть класс, который я больше не хочу использовать. Я создал базовый класс и сделал мой устаревший класс дочерним по отношению к новому базовому классу.Удалить 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; }
}
Похоже, что ваша собственность является обязательной частью контракта. – Tejs
Почему бы просто не отметить его как устаревший и создать новый API с классом, который принимает старый класс как параметр конструктора? http://msdn.microsoft.com/en-us/library/system.obsoleteattribute.aspx – Lloyd
DataMembers не следует удалять из существующего DataContract. Вот почему я создал новый базовый класс и пометил старый, производный класс устаревшим. Я также обновил любые данные старого типа для ссылки на новый базовый тип. –