【发布时间】: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())
不过,我想知道为什么常规方式会失败。
【问题讨论】:
-
你最终解决了这个问题吗?我有完全相同的问题(
CanReadBinaryContent是true,但它仍然失败),但此外,我无法访问实际崩溃的序列化程序(我在DataContract中嵌入了一个实现IXmlSerializable的对象)。
标签: .net serialization datacontractserializer ixmlserializable