2010-03-23 8 views
11

Ho una classe base con una proprietà denominata Nome, che ha un attributo XmlText.L'attributo XmlText nella classe base interrompe la serializzazione

Quando una classe ereditata viene serializzata ottengo un'eccezione dicendo:

Si è verificato un errore di tipo riflettendo '[nome del tipo]'. ---> System.InvalidOperationException: Impossibile serializzare l'oggetto di tipo '[tipo nome]'. Il tipo di base "[nome tipo base]" dispone di SimpleContent e può essere esteso a aggiungendo XmlAttribute elementi. Si prega di prendere in considerazione di cambiare membro XmlText della classe base nell'array di stringhe .

Ecco le mie definizioni di classe, l'errore si verifica durante la serializzazione in xml.

[Serializable] 
public class LookupItem 
{ 
    [System.Xml.Serialization.XmlAttribute()] 
    public int ID { get; set; } 

    [System.Xml.Serialization.XmlText()] 
    public string Name { get; set; } 
} 

[Serializable] 
public class Vendor : LookupItem 
{ 
    public string ContactNumber { get; set; } 
} 

[Serializable] 
public class Vendors : List<Vendor> 
{ 

} 

risposta

15

Sembra che succeda perché la classe LookupItem non ha alcun elemento figlio nella sua rappresentazione XML. Per questo motivo, XmlSerializer considera un elemento XML simpleContent. Se si aggiunge una nuova proprietà a LookupItem, che deve essere serializzata come elemento XML, funziona correttamente.

abbiamo appena trascorso un paio di minuti a guardare il XML disponibili attributi di serializzazione, ma non sono riuscito a trovare alcuna che permetta di specificare che il tipo non è un elemento simpleContent ...

Quindi penso che si potrebbe fallo funzionare aggiungendo una proprietà fittizia o un campo che non usi mai nella classe LookupItem. Se non si assegna mai un valore, esso rimarrà nullo e non verrà serializzato, ma impedirà che la classe venga trattata come simpleContent. Lo so che è una soluzione sporca, ma non vedo altro modo semplice ...

public class LookupItem 
{ 
    [System.Xml.Serialization.XmlAttribute()] 
    public int ID { get; set; } 

    [System.Xml.Serialization.XmlText()] 
    public string Name { get; set; } 

    public object _dummy; 
} 

(BTW, si noti che l'attributo Serializable non è necessario per la serializzazione XML.)

In ogni caso, non si ha realmente bisogno serializzare Name come testo XML? Questo è abbastanza raro, di solito gli elementi XML hanno sia un semplice contenuto (testo), sia elementi figlio ... Un mix di entrambi rende l'XML più difficile da leggere, quindi a meno che non sei obbligato a farlo, ti suggerisco di serializzare Name come attributo o elemento figlio.

Problemi correlati