(Allegato alla risposta di Steve Guidi)
Per quanto posso vedere non v'è alcuna implementazione di XmlReader
si può facilmente utilizzare con XDocument
senza spostare il Contenuto XML attraverso un negozio intermedio come una rappresentazione in stringa dell'XML e che supporta tutti i tipi che ad esempio supporta System.Xml.XmlNodeReader
.
Il lettore restituito da XDocument.CreateReader
(che è un System.Xml.Linq.XNodeReader
, una classe interna) è un XmlReader
e funziona per la maggior parte del documento XML, ma non con i documenti che hanno elementi di dati binari, perché la sua attuazione does not support Base64 or BinHex data:
Base64 e I dati BinHex non sono supportati. Se si tenta di recuperare questi tipi di dati (ad esempio, chiamando ReadElementContentAsBase64), il lettore genererà NotSupportedException.
Per questo lettore XDocument.CreateReader().CanReadBinaryContent
è false
in contrasto con la System.Xml.XmlNodeReader
.
Per esempio, questo programma genera un'eccezione:
public class SomeTest
{
public byte[] BinaryTest { get; set; }
}
class Program
{
static void Main(string[] args)
{
XDocument document = new XDocument(
new XElement("SomeTest",
new XElement("BinaryTest", "VGVzdA==")));
using (var reader = document.CreateReader())
{
var serializer = new XmlSerializer(typeof(SomeTest));
var someTest = serializer.Deserialize(reader) as SomeTest;
// NotSupportedException here (as inner exception)
}
}
}
Tuttavia, l'estrazione del XML come string
e passando come TextReader
nel serializzatore funziona:
using (var reader = new StringReader(document.ToString()))
mi interesserebbe pure se c'è un altro modo per deserializzare un XDocument
che include dati binari senza prima convertirlo in una stringa.
Vedi anche http://stackoverflow.com/q/7901558/11912 –