Так у меня есть классы:комплекс типа класса не сериализуются 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
. Однако это ничего не делало.
У меня есть еще один класс сложного типа, который не имеет интерфейсов, и этот класс сериализуется правильно.
Должны ли эти интерфейсы что-либо делать? Или я пропустил что-то простое и маленькое?
Редактировать: Избавиться от интерфейсов не помогло.
В таких случаях это проще сериализовать вручную этот сложный тип (например, как «строка»). Для этого вы помечаете существующее свойство с помощью '[XmlIgnore]' и создаете другое свойство (типа 'string'), в getter/setter которого вы сериализуете/десериализуете значение сложного типа. Таким образом, 'XmlSerializer' не имеет проблем с сериализацией/десериализацией полного типа. – Sinatr
Хорошо, я буду держать эту опцию открытой, но, как я уже упоминал, у меня есть еще один сложный тип, и он правильно сериализуется. –
Проблема в том, что 'ComplexTypeClass' не имеет ничего сериализуемого (свойства только для getter [не сериализованы] (http://stackoverflow.com/a/13401220/1997232)). Это не имеет никакого отношения к базовому классу или интерфейсам (в этом случае вы получите исключение). – Sinatr