5
using System.IO; 
using System.Runtime.Serialization; 
using System.Xml; 
using System.Xml.Schema; 
using System.Xml.Serialization; 

namespace XmlTest 
{ 
    class TestClass : IXmlSerializable 
    { 
     public XmlSchema GetSchema() 
     { 
      return null; 
     } 

     public void ReadXml(XmlReader reader) 
     { 
      var data = new byte[3]; 
      reader.ReadStartElement(); 
      reader.ReadElementContentAsBase64(data, 0, data.Length); 
     } 

     public void WriteXml(XmlWriter writer) 
     { 
      var data = new byte[] { 1, 2, 3 }; 
      writer.WriteBase64(data, 0, data.Length); 
     } 

     public static void Main() 
     { 
      var serializer = new DataContractSerializer(typeof(TestClass)); 

      var stringWriter = new StringWriter(); 
      using (var writer = XmlWriter.Create(stringWriter)) 
      { 
       serializer.WriteObject(writer, new TestClass()); 
      } 

      var stringReader = new StringReader(stringWriter.ToString()); 
      using (var reader = XmlReader.Create(stringReader)) 
      { 
       serializer.ReadObject(reader, true); 
      } 
     } 
    } 
} 

Die ReadElementContentAsBase64 Linie wirft NotSupportedException mit message:"ReadElementContentAsBase64 Verfahren ist nicht in diesem XmlReader unterstützt"

ReadElementContentAsBase64 Verfahren ist nicht in diesem XmlReader unterstützt. Verwenden Sie die CanReadBinaryContent-Eigenschaft, um herauszufinden, ob ein Leser sie implementiert.

(I geprüft und CanReadBinaryContent liefert true)

Ich bin mit dem Microsoft .NET 3.5 Framework-Implementierung.

Was könnte die Ursache sein?

Hinweis: Ich bin absichtlich DataContractSerializer mit IXmlSerializable mischen. Mir ist klar, dass der häufigere Ansatz für DataContractSerializer ist meine Klasse eines [Datacontract] zu machen.

Edit: Ich bin jetzt eine Abhilfe verwenden:
Convert.FromBase64String(reader.ReadElementContentAsString())
Dennoch frage ich mich, warum die normale Art und Weise versagt.

+0

Haben Sie dieses Problem schließlich gelöst? Ich habe genau das gleiche Problem ('CanReadBinaryContent' ist' true', aber es immer noch nicht), sondern zusätzlich, ich habe keinen Zugriff auf die Serializer, die tatsächlich abstürzt (I einzubetten ein Objekt, das 'IXmlSerializable' in einem' DataContract' implementiert). – Christoph

Antwort

6

begegnete ich auch dieses Problem. Die XmlReader von Linq des erstellt doc.CreateReader() implementiert nicht Base64-Decodierung. Ich habe um ihn herum durch erste Einsparung an einen Memorystream und die Schaffung eines XmlReader aus, dass:

 Stream s = new MemoryStream(); 
    XmlSerializer serializer = new XmlSerializer(typeof(SerializableDocument)); 
    document.Save(s); 
    s.Seek(0, SeekOrigin.Begin); 

    using (XmlReader newReader = XmlReader.Create(s)) 
    { 
     SerializableDocument serializableDocument = (SerializableDocument)serializer.Deserialize(newReader); 
     // do stuff with it 
    } 
1

ich Robert Antwort nahm und verwandelte sie in eine Erweiterungsmethode, viel Spaß!

public static T DeserializeWithBinaryData<T>(this XElement el) 
{ 
    var xDoc = el.ToXmlDocument(); 
    using (var ms = new MemoryStream()) 
    { 
     xDoc.Save(ms); 
     ms.Seek(0, SeekOrigin.Begin); 
     var serializer = new XmlSerializer(typeof (T)); 
     return (T)serializer.Deserialize(ms); 
    } 
} 
Verwandte Themen