2012-05-10 5 views
1

Использование DCS Я пытаюсь десериализовать объекты из XML, где сериализуемый объект имеет тип Child, наследующий класс Base, где Child имеет некоторые свойства, которые были десериализованы, но позже были перенесены в класс База в коде. Теперь эти свойства не получают десериализации:десериализация DataContractSerializer свойств, перенесенных из производного класса в базовый класс

Посмотрите на этот XML:

<Base i:type="a:DirectoryEntry" xmlns="http://schemas.datacontract.org/2004/07/pending.Core.Models" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:a="http://schemas.datacontract.org/2004/07/pending.Core.Models.Directory"> 
    <Active>true</Active> 
    <ContentType>DirectoryEntry</ContentType> 
    <Created>2012-03-12T11:51:25.3401552+01:00</Created> 
    <a:Location>location</a:Location> 
    <a:OpenHours>opening</a:OpenHours> 
</Base> 

Xmlns: а обозначает имя производного типа. Этот класс использовался для хранения этих реквизитов. Теперь они были перемещены в базовый класс, и они больше не десериализуются DCS (свойства являются пустыми после десериализации). Я говорю о свойствах с: перед ними (Location и OpenHours в этом случае).

У нас есть много этих файлов, содержащих данные. Каковы мои варианты правильного десериализации этих файлов с помощью DCS?

Пожалуйста, обратите внимание, что [KnownType] атрибуты используются как на базе и детского класса

ответ

0

Мое решение состояло в том, чтобы перенести свойства обратно в исходный класс, а также оставить их в классе, к которому они были сначала перемещены. Теперь он дает предупреждение Property hides the inherited member...Use the new keyword if hiding was intended, но я может жить с этим, потому что десериализация теперь работает снова, мы можем перемещать данные от одного провайдера к другому. Я не смог найти какое-либо другое решение, и изменение всех файлов с сериализованными данными не было вариантом.

0

Когда вы переместили свойства базового класса, они фактически перемещены в другое пространство имен XML. Базовый класс, вероятно, определен в пространстве имен pending.Core.Models, тогда как производный класс определен в pending.Core.Models.Directory (я предполагаю, что вы не указали ничего в свойстве Namespace атрибута [DataContract].Так что если вы изменили пространство имен, в котором должен быть элемент, то сериализатор не сможет сопоставить его с данными, которые у вас есть. Если вы переместили последние два свойства в базовый класс, вам нужно будет изменить пространство имен элементов XML Location и OpenHours.

<Base i:type="a:DirectoryEntry" 
     xmlns="http://schemas.datacontract.org/2004/07/pending.Core.Models" 
     xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:a="http://schemas.datacontract.org/2004/07/pending.Core.Models.Directory"> 
    <Active>true</Active> 
    <ContentType>DirectoryEntry</ContentType> 
    <Created>2012-03-12T11:51:25.3401552+01:00</Created> 
    <Location>location</Location> 
    <OpenHours>opening</OpenHours> 
</Base> 
+0

спасибо, это очевидный ответ, но требует ручного изменения файлов XML. Вы знаете альтернативу, которая заставит DCS найти эти свойства в базовом классе и сериализовать их? – mare

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