Come sempre dico "mai usare quello che non è documentato", ma a volte non mi ascolto :(. E infatti questo post per segnalare un _bug_/imprecisione quando ho parlato di CDATA e implementaizone dell'interfaccia IXmlSerializable: "Come ti serializzo in CDATA", e il tip "Serializzare elementi CData implementando IXmlSerializable" (che provvederò a correggere dopo qualche ulteriore accertamento).
Il problema sta nell'implementazione del metodo di lettura "void IXmlSerializable.ReadXml(System.Xml.XmlReader reader)". Sembra essere infatti necessario portare il reader sul prossimo nodo prima che il metodo si concluda. Se avete seguito il mio tip e il campo CDATA lo avete usato come ultimo elmento del vostro schema allora non dovreste avete avuto problemi. Se il campo CDATA è invece un elemento non ultimo del vostro schema è probabile che la deserializzazione vi abbia dato qualche problema.
L'implementazione di IXmlSerializable.ReadXml è da rivedere come segue:
void IXmlSerializable.ReadXml(System.Xml.XmlReader reader)
{
this.Text = reader.ReadString();
reader.Read();
}
A parte per qualche sparuto - e poco descritto - esempio in rete (vedi "Customize XML Serialization using IXmlSerializable") non ho trovato alcuna documentazione sulla cosa e nemmeno reflector - per ora - mi ha saputo aiutare. I test mi hanno portato a tale conclusione.
[UPDATE 04-nov-2005]. Altra soluzione è quella di usare GetElementString che unisce il ReadString e il posizionamento sul successivo nodo.
void IXmlSerializable.ReadXml(System.Xml.XmlReader reader)
{
this.Text = reader.ReadElementString();
}