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

La línea de tiros ReadElementContentAsBase64NotSupportedException con el mensaje:"método ReadElementContentAsBase64 no es compatible con esta XmlReader"

método ReadElementContentAsBase64 no es compatible con esta XmlReader. Use la propiedad CanReadBinaryContent para averiguar si un lector lo implementa.

(he comprobado, y devuelve verdadero CanReadBinaryContent)

estoy usando el Microsoft .NET Framework 3.5 aplicación.

¿Qué podría causar esto?

Nota: Estoy intencionalmente mezclando DataContractSerializer con IXmlSerializable. Me doy cuenta de que el enfoque más común para DataContractSerializer es hacer de mi clase un [DataContract].

Editar: ahora estoy usando una solución:
Convert.FromBase64String(reader.ReadElementContentAsString())
embargo, me pregunto por qué la manera regular falla.

+0

¿Resolvió eventualmente este problema? Tengo exactamente el mismo problema ('CanReadBinaryContent' es' true', pero sigue fallando), pero, además, no tengo acceso al serializador que realmente falla (incrusto un objeto que implementa 'IXmlSerializable' en' DataContract') – Christoph

Respuesta

6

También encontré este problema. El XmlReader creado por linq doc.CreateReader() no implementa la decodificación Base64. Tengo alrededor de ella por primera vez a un ahorro MemoryStream y creando un XmlReader de que:

 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

Tomé la respuesta de Robert y lo convirtieron en un método de extensión, disfrutar!

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); 
    } 
} 
Cuestiones relacionadas