標準の .Net XmlSerializer を使用した CDATA デシリアライゼーションに問題があります。
更新: 外部システムから XML を取得しましたが、その形式に影響を与えることができないため、CData を属性の別の要素に含めることはできません。
シリアル化すると、次のようになります。
<?xml version="1.0" encoding="utf-16"?>
<MyClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><![CDATA[Hello, world!]]></MyClass>
逆シリアル化は、オブジェクトを元の状態に復元しません。
シリアル化されているクラスは次のとおりです。
public class MyClass
{
string _data;
[XmlIgnore]
public string Data
{
get { return _data; }
set { _data = value; }
}
[XmlAnyElement]
public XmlCDataSection CData
{
get { return new XmlDataDocument().CreateCDataSection(Data); }
set { Data = value.Value; }
}
}
失敗するテストは次のとおりです。
[Test]
public void CData_as_inner_text_test()
{
MyClass item = new MyClass();
item.Data = "Hello, world!";
XmlSerializer serializer = new XmlSerializer(item.GetType());
string serialized;
using (StringWriter sw = new StringWriter())
{
serializer.Serialize(sw, item);
serialized = sw.GetStringBuilder().ToString();
}
MyClass deserialized;
using (StringReader sr = new StringReader(serialized))
{
deserialized = (MyClass)serializer.Deserialize(sr);
}
Assert.AreEqual(item.Data, deserialized.Data); // For some reason, deserialized.Data == null
}
ここで同じ問題を見つけましたが、答えはありません: XmlSerializer、XmlAnyElement、および CDATA