2015-08-18 6 views
0

У меня есть класс настроек, который сохраняется с использованием сериализации DataContract. Теперь я хочу извлечь некоторые свойства в базовый класс, но это изменяет порядок записей в сгенерированном xml и разрывает десериализацию. Я нашел это удивительным, поскольку все поля и имя класса одинаковы. Каков самый простой способ прочитать старые файлы в новой структуре?Как извлечь базовый класс из класса, который использует DataContractAttribute, не внося изменения?

Редактировать: установка заказа не работает. Базовые параметры класса всегда на первом месте, за ними следуют производные члены.

например.

[DataContract] 
    public class MyClass 
    { 
     [DataMember] 
     public string A { get; set; } 

     [DataMember] 
     public string B { get; set; } 

     [DataMember] 
     public string C { get; set; } 
    } 

Это выводит Params в порядке A, B, C

Теперь, если я сделаю это

[DataContract] 
public abstract class MyBaseClass 
{ 
    [DataMember] 
    public string C { get; set; } 
} 

[DataContract] 
public class MyClass : MyBaseClass 
{ 
    [DataMember] 
    public string A { get; set; } 

    [DataMember] 
    public string B { get; set; } 
} 

заказ будет C, A, B. C будет первым, независимо от того, что я поставил для заказа.

+0

Согласно [документации] (https://msdn.microsoft.com/en-us/library/ms729813%28v=vs.110%29.aspx), база-первый порядок элементов данных не может быть переопределено ['[DataMember (Order = xxx)]'] (https://msdn.microsoft.com/en-us/library/system.runtime.serialization.datamemberattribute.order (v = vs.110) .aspx). Возможно, вам придется использовать [Surrogat Data Contract Surrogate] (https://msdn.microsoft.com/en-us/library/ms733064%28v=vs.110%29.aspx) или реализовать 'ISerializable'. – dbc

ответ

0

Вы можете использовать Заказ в атрибуте , например. [DataMember (Order = 0)]

0

Вы должны установить порядок явного:

[DataContract] 
public class BaseType 
{ 
    [DataMember] 
    public string zebra; 
} 

[DataContract] 
public class DerivedType : BaseType 
{ 
    [DataMember(Order = 0)] 
    public string bird; 
    [DataMember(Order = 1)] 
    public string parrot; 
    [DataMember] 
    public string dog; 
    [DataMember(Order = 3)] 
    public string antelope; 
    [DataMember] 
    public string cat; 
    [DataMember(Order = 1)] 
    public string albatross; 
} 

See - MSDN - Data Member Order

+2

Код, похоже, скопирован из MSDN. Вы можете добавить ссылку на источник. –

0

Одно решение, которое приходит на ум, это переопределить членов в производном классе для поддержания оригинальный заказ. Также можно использовать порядок в производном типе. Проблема в том, что вы не можете переопределять поля, поэтому я бы попытался изменить их на свойства. Создание всех свойств с помощью методов get и set не должно иметь никакого значения (хотя я не уверен на 100% в вашем случае).

[DataContract] 
public class BaseType 
{ 
    [DataMember] 
    public virtual string zebra { get; set; } 
} 


[DataContract] 
public class DerivedType : BaseType 
{ 
    [DataMember] 
    public override string zebra { get; set; } 
    [DataMember] 
    public string bird { get; set; } 
    [DataMember] 
    public string parrot { get; set; } 
    [DataMember] 
    public string dog { get; set; } 
    [DataMember] 
    public string antelope { get; set; } 
    [DataMember] 
    public string cat { get; set; } 
    [DataMember] 
    public string albatross { get; set; } 
}