Удалите DataMember, создав новый базовый класс и устарев производный класс - PullRequest
1 голос
/ 18 января 2012

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

В отношении данных единственное различие между этими двумя классами заключается в одном свойстве DataMember.

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

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

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

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

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

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

** EDIT:

Сериализуйте с этим:

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

1 Ответ

0 голосов
/ 19 января 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...