2016-05-19 8 views
0

Так у меня есть классы:комплекс типа класса не сериализуются XmlSerializer

public class classA : BaseClass 
{ 
    public classA(){} 
} 


public abstract class BaseClass 
{ 
    public ComplexTypeClass Total { get; set; } 
    public List<Item> Items {get; set; } 
    //some other properties 
} 


public class ComplexTypeClass : ValueObject<ComplexTypeClass> 
{ 
    public ComplexTypeClass() 
    { 
    } 
    public ComplexTypeClass(decimal p1, decimal p2, decimal p) 
    { 
     P1 = p1; 
     P2 = p2; 
     P3 = p3; 
    } 
    public decimal P1 { get; } 
    public decimal P2 { get; } 
    public decimal P3 { get; } 

    //some methods and validations 
} 


public abstract class ValueObject<T> : IEquatable<T>, IValidatableObject where T : ValueObject<T> 
{ 
    //all implemented interfaces methods 
} 

И тогда я пытаюсь сериализации classA, все свойства и список сериализуются правильно, за исключением ComplexTypeClass собственности. Для этого свойства я получаю такую ​​строку в xml <Total />.

Все классы имеют [Serializable], [ComplexType], [XmlType] атрибуты. Я пробовал и другие комбинации. Я пробовал использовать [XmlElement], [XmlRoot] на ComplexTypeClass. Однако это ничего не делало.

У меня есть еще один класс сложного типа, который не имеет интерфейсов, и этот класс сериализуется правильно.

Должны ли эти интерфейсы что-либо делать? Или я пропустил что-то простое и маленькое?

Редактировать: Избавиться от интерфейсов не помогло.

+0

В таких случаях это проще сериализовать вручную этот сложный тип (например, как «строка»). Для этого вы помечаете существующее свойство с помощью '[XmlIgnore]' и создаете другое свойство (типа 'string'), в getter/setter которого вы сериализуете/десериализуете значение сложного типа. Таким образом, 'XmlSerializer' не имеет проблем с сериализацией/десериализацией полного типа. – Sinatr

+0

Хорошо, я буду держать эту опцию открытой, но, как я уже упоминал, у меня есть еще один сложный тип, и он правильно сериализуется. –

+1

Проблема в том, что 'ComplexTypeClass' не имеет ничего сериализуемого (свойства только для getter [не сериализованы] (http://stackoverflow.com/a/13401220/1997232)). Это не имеет никакого отношения к базовому классу или интерфейсам (в этом случае вы получите исключение). – Sinatr

ответ

0

Если какой-либо один натыкается на такого рода проблемы, как и смиренный @Sinatr отметил, ComplexTypeClass свойства

public decimal P1 { get; } 
public decimal P2 { get; } 
public decimal P3 { get; } 

не было set, поэтому XmlSerializer не могли заселить этот объект