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
ReadElementContentAsBase64 メソッドは、この XmlReader ではサポートされていません。CanReadBinaryContent プロパティを使用して、リーダーがそれを実装しているかどうかを調べます。
(確認したところ、CanReadBinaryContent は true を返します)
Microsoft .NET 3.5 フレームワークの実装を使用しています。
何が原因でしょうか?
注: 意図的に DataContractSerializer と IXmlSerializable を混在させています。DataContractSerializer のより一般的なアプローチは、クラスを [DataContract] にすることです。
編集:私は現在、回避策を使用しています:
Convert.FromBase64String(reader.ReadElementContentAsString())
それでも、なぜ通常の方法が失敗するのだろうか.