Perché XmlSerializer
popola la proprietà dell’object con un array XmlNode
quando deserializza un elemento digitato vuoto utilizzando XmlNodeReader
anziché una stringa vuota come quando utilizza StringReader
(o XmlTextReader
)?
La seconda asserzione nel seguente esempio di codice non riesce:
var doc = new XmlDocument(); doc.Load(new StringReader(@" ")); var ser = new XmlSerializer(typeof (Test)); var reader1 = new StringReader(doc.InnerXml); var obj1 = (Test) ser.Deserialize(reader1); Debug.Assert(obj1.Value is string); var reader2 = new XmlNodeReader(doc.FirstChild); var obj2 = (Test) ser.Deserialize(reader2); Debug.Assert(obj2.Value is string); public class Test { public object Value { get; set; } }
Immagino che abbia qualcosa a che fare con la proprietà NamespaceManager
interna nulla, ma non sono sicuro di come aggirare questa misteriosa limitazione. Come posso deserializzare in modo affidabile un sottoinsieme del mio documento XML analizzato senza convertirlo in una stringa e ri-analizzare?
Sembra che questo sia un bug XmlNodeReader
molto vecchio che Microsoft non ha intenzione di risolvere . (Collegamento a Microsoft Connect archiviato qui ). Ho trovato una soluzione alternativa sul blog di Lev Gimelfarb che aggiunge spazi dei nomi al NameTable
del lettore NameTable
che i prefissi vengono cercati.
public class ProperXmlNodeReader : XmlNodeReader { public ProperXmlNodeReader(XmlNode node) : base(node) { } public override string LookupNamespace(string prefix) { return NameTable.Add(base.LookupNamespace(prefix)); } }