をシリアルIは、次の形式上のオブジェクトから動的に作成されたXMLノードのセットを構築する必要がありますXML動的オブジェクトを
<Root>
<Name>My Name</Name>
<DynamicValues>
<DynamicValue1>Value 1</DynamicValue1>
<DynamicValue2>Value 2</DynamicValue2>
</DynamicValues>
</Root>
DynamicValues
-tag内のノードの名前が事前に知られていません。
[DataContract]
public class Root
{
[DataMember]
public string Name { get; set; }
[DataMember]
public dynamic DynamicValues { get; set; }
}
値でそれを初期化することにより:その後、
var root = new Root
{
Name = "My Name",
DynamicValues = new ExpandoObject()
};
root.DynamicValues.DynamicValue1 = "Value 1";
root.DynamicValues.DynamicValue2 = "Value 2";
し、それをXML-シリアライズ:
string xmlString;
var serializer = new DataContractSerializer(root.GetType());
using (var backing = new StringWriter())
using (var writer = new XmlTextWriter(backing))
{
serializer.WriteObject(writer, root);
xmlString = backing.ToString();
}
私の最初に考えたのは、これがExpando Object、例えばを使用可能でなければならないことでしたしかし、これを実行すると、SerializationExceptionというメッセージが表示されます。
"型 'System.Dynamic.ExpandoObject'、データコントラクト名が 'ArrayOfKeyValueOfstringanyType:http://schemas.microsoft.com/2003/10/Serialization/Arrays' であるとは限りません。 KnownTypeAttribute属性を使用するか、DataContractSerializerに渡される既知の種類の リストに追加することで、例えば「
を - DataContractResolverを使用することを検討したり、既知のタイプのリストに静的に知られていない任意の タイプを追加。私はこれを達成することができますどのように任意のアイデア
それは確かに例外をスローせずに、ではなく、私は(問題の例のXMLを参照してください)期待したものにシリアライズありません。私は 'KeyValueOfstringanyType'型のノードを取得します。 –
@OlavHaugen、私は私の答えを更新しました。 –
素晴らしい作品です。ありがとう! –