Deserializzare la proprietà dell’object con StringReader e XmlNodeReader

PercXmlSerializer 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)); } }