【问题标题】:"ReadElementContentAsBase64 method is not supported on this XmlReader"“此 XmlReader 不支持 ReadElementContentAsBase64 方法”
【发布时间】:2011-04-15 11:58:33
【问题描述】:
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);
            }
        }
    }
}

ReadElementContentAsBase64 行抛出 NotSupportedException 并带有消息:

此 XmlReader 不支持 ReadElementContentAsBase64 方法。使用 CanReadBinaryContent 属性来确定阅读器是否实现了它。

(我检查了,CanReadBinaryContent 返回 true)

我正在使用 Microsoft .NET 3.5 框架实现。

什么可能导致这种情况?

注意:我有意将 DataContractSerializer 与 IXmlSerializable 混合使用。我意识到 DataContractSerializer 更常见的方法是让我的类成为 [DataContract]。

编辑:我现在正在使用解决方法:
Convert.FromBase64String(reader.ReadElementContentAsString())
不过,我想知道为什么常规方式会失败。

【问题讨论】:

  • 你最终解决了这个问题吗?我有完全相同的问题(CanReadBinaryContenttrue,但它仍然失败),但此外,我无法访问实际崩溃的序列化程序(我在DataContract 中嵌入了一个实现IXmlSerializable 的对象)。

标签: .net serialization datacontractserializer ixmlserializable


【解决方案1】:

我把罗伯特的回答变成了一个扩展方法,享受吧!

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

【讨论】:

    【解决方案2】:

    我也遇到过这个问题。 linq 的doc.CreateReader() 创建的XmlReader 没有实现Base64 解码。我通过首先保存到 MemoryStream 并从中创建 XmlReader 来解决它:

         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
         }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-23
      • 2020-04-13
      • 2020-12-06
      • 2019-12-17
      • 1970-01-01
      • 2020-09-04
      • 1970-01-01
      相关资源
      最近更新 更多