IXmlSerializable を実装する基本クラスから継承するクラスをシリアル化しようとしています。
PropertyBag と呼ばれる基本クラスは、動的プロパティを許可するクラスです ( Marc Gravell の功績によるものです)。
IXmlSerializable を実装して、動的プロパティ (Dictionary に格納されている) が通常の xml 要素として記述されるようにしました。
たとえば、クラス Person をパブリック プロパティ (非動的) Name と動的プロパティ Age でシリアル化する場合、次の XML を生成したいと考えています。
<Person>
<Name>Tim</Name>
<DynamicProperties>
<Country>
<string>USA</string>
</Country>
</DynamicProperties>
<Person>
基本 PropertyBag クラスの WriteXml の次の実装で動作するパーツを取得できます。
public void WriteXml(System.Xml.XmlWriter writer)
{
writer.WriteStartElement("DynamicProperties");
// serialize every dynamic property and add it to the parent writer
foreach (KeyValuePair<string, object> kvp in properties)
{
writer.WriteStartElement(kvp.Key);
StringBuilder itemXml = new StringBuilder();
using (XmlWriter itemWriter = XmlWriter.Create(itemXml))
{
// serialize the item
XmlSerializer xmlSer = new XmlSerializer(kvp.Value.GetType());
xmlSer.Serialize(itemWriter, kvp.Value);
// read in the serialized xml
XmlDocument doc = new XmlDocument();
doc.LoadXml(itemXml.ToString());
// write to modified content to the parent writer
writer.WriteRaw(doc.DocumentElement.OuterXml);
}
writer.WriteEndElement();
}
writer.WriteEndElement();
}
ただし、Person クラスをシリアル化する場合、Person の WriteXml メソッドを上書きしない限り、通常の (動的ではない) プロパティはシリアル化されなくなります (これはやりたくありません)。基本クラスで静的プロパティを自動的に追加できる方法はありますか? リフレクションを使用して手動でこれを行うことができることは知っていますが、.Net Framework に組み込み機能があるかどうか疑問に思っていましたか?