2016-05-19 1 views
0

Alors j'ai des classes:classe de type complexe ne pas être sérialisé par 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 
} 

Et puis j'essaie sérialisation classA, toutes les propriétés et la liste sont sérialisés correctement, à l'exception de la propriété ComplexTypeClass. Pour cette propriété, je reçois une telle ligne dans xml <Total />. Tous les classes ont [Serializable], [ComplexType], [XmlType] attributs. J'ai essayé différentes combinaisons aussi. J'ai essayé d'utiliser [XmlElement], [XmlRoot] sur la propriété ComplexTypeClass. Cependant, cela n'a rien fait.

J'ai une autre classe de type complexe, qui n'a pas d'interface, et cette classe est sérialisée correctement.

Est-ce que ces interfaces doivent faire quelque chose? Ou est-ce que je manque quelque chose de simple et de petit?

Modifier: se débarrasser des interfaces n'a pas aidé.

+0

Dans de tels cas, il est il est plus facile de sérialiser manuellement ce type complexe (par exemple, en tant que «chaîne»). Pour cela vous marquez la propriété existante avec '[XmlIgnore]' et créez une autre propriété (de type 'string'), dans getter/setter dont vous sérialiser/désérialiser la valeur de type complexe. De cette façon, 'XmlSerializer' n'a pas de problèmes pour sérialiser/désérialiser le type complet. – Sinatr

+0

bien, je garderai cette option ouverte, mais comme je l'ai mentionné j'ai un autre type complexe et il est sérialisé correctement –

+1

Le problème est que ComplexTypeClass n'a rien de sérialisable (les propriétés de getter-only sont [non sérialisées] (http://stackoverflow.com/a/13401220/1997232)). Cela n'a rien à voir avec la classe de base ou les interfaces (vous obtiendrez une exception dans ce cas). – Sinatr

Répondre

0

Si quelqu'un trébuche sur ce genre de problème, humble @Sinatr a fait remarquer, ComplexTypeClass propriétés

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

n'a pas eu set, si XmlSerializer ne pouvait pas repeupler cet objet