オブジェクトを直列化して逆シリアル化しようとしています。シリアル化は、[OK]を動作しますが、直列化復元は、シリアル化されたXMLがOKに見えるオブジェクトをシリアル化および逆シリアル化します(XMLドキュメント(0、0)にエラーがあります)。
System.InvalidOperationException : There is an error in XML document (1, 1).
----> System.Xml.XmlException : Data at the root level is invalid. Line 1, position 1.
スロー:
<?xml version="1.0" encoding="utf-16"?>
<Data xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Id="1" Status="OK" xmlns="http://biz.si/Project/v0100/Data.xsd">
<DataGroup Type="SomeType">AAEC</DataGroup>
</Data>
エンコーディングがUTF-16、OKですが、私はエンコードの問題が直列化復元中に存在している疑いがあります。コードはテスト環境(ユニットテスト)で実行されていますが、シリアル化されたxmlはWebサービスに送信されます。
これは私のコードです:ここ
[TestFixture]
public class Foobar
{
[Test]
public void Test()
{
var d = new Data
{
Id = "1",
Status = "OK",
DataGroup = new DataGroup
{
Type = "SomeType",
Value = new byte[] { 0x00, 0x01, 0x02 }
}
};
var serialized = Serialize(d);
var deserialized = Deserialize(serialized); // exception is thrown here.
Debug.WriteLine("ok");
}
private XmlNode Serialize(Data data)
{
XmlSerializer xsSubmit = new XmlSerializer(typeof(Data));
StringWriter sww = new StringWriter();
using (XmlWriter writer = XmlWriter.Create(sww))
{
xsSubmit.Serialize(writer, data);
var xml = sww.ToString();
var xmlDocument = new XmlDocument();
xmlDocument.LoadXml(xml);
return xmlDocument;
}
}
private Data Deserialize(XmlNode xmlData)
{
XmlSerializer xmlSerializer = new XmlSerializer(typeof(Data));
MemoryStream memoryStream = new MemoryStream(Encoding.Default.GetBytes(xmlData.InnerText));
return (Data)xmlSerializer.Deserialize(memoryStream);
}
}
[XmlRoot(Namespace = "http://biz.si/Project/v0100/Data.xsd", IsNullable = false)]
[XmlType(AnonymousType = true)]
public class Data
{
[XmlAttribute]
public string Id { get; set; }
[XmlAttribute]
public string Status { get; set; }
[XmlElement("DataGroup")]
public DataGroup DataGroup { get; set; }
}
[XmlType(AnonymousType = true)]
public class DataGroup
{
[XmlAttribute]
public string Type { get; set; }
[XmlText(DataType = "base64Binary")]
public byte[] Value { get; set; }
}
A C#クラスは、パラメータなし(ベースクラスはない公共のパラメータなしのコンストラクタを有していない面白いケースを付与する)デフォルトのコンストラクタを有します。これが、パラメータのないコンストラクタを持たないように見えるクラスを直列化することができるように見える理由です。彼の 'Test()'メソッドは、コンストラクタパラメータなしで 'Data' *のインスタンスを生成することに注意してください。*:' var d = new Data {}; '。それは無パラメータのコンストラクタです。 –
情報ありがとうございました!私は新しいことを学ぶのが大好きです。 – DB9