0

次のコードを使用して、オブジェクトからXMLにシリアル化/逆シリアル化しています

using System.Runtime.Serialization;
public static string Serialize<T>(this T obj)
        {
            var serializer = new DataContractSerializer(obj.GetType());
            using (var writer = new StringWriter())
            using (var stm = new XmlTextWriter(writer))
            {
                serializer.WriteObject(stm, obj);
                return writer.ToString();
            }
        }

        public static T Deserialize<T>(this string serialized)
        {
            var serializer = new DataContractSerializer(typeof(T));
            using (var reader = new StringReader(serialized))
            using (var stm = new XmlTextReader(reader))
            {
                return (T)serializer.ReadObject(stm);
            }
        }

このコードをIDictionaryで機能させるために、次のカスタム辞書クラスがあります。

[CollectionDataContract(Name = "Kenan", ItemName="Items", KeyName="Row", Namespace="spell", ValueName="Values")]
public class CustomRowList : Dictionary<RowXML, List<ColumnXML>>
{

}

問題は、コードが

Dictionary<RowXML, List<ColumnXML>>

次のようになります。

ここに画像の説明を入力してください

<Items><Values>ノードは必要ありません。代わりに、次のように出力したいと思います。

<RowList>
<Row>
<Title></Title>
<Help_Text></Help_Text>
<ClassName></ClassName>
<ColumnList>
<Column>
<ClassName></ClassName>
<Help_Text></Help_Text>
<Title></Title>
</Column>
<Column>
...

この方法でDataContractSerializerに辞書をフォーマットさせるにはどうすればよいですか?設定してみました

ItemName

ValueName

の上

[CollectionDataContract]

プロパティを空白にしますが、これは機能しませんでした。

4

1 に答える 1

2

コレクションクラスのxml出力をカスタマイズしたいようです。この期待される出力を達成する唯一の方法は、以下のようにIXmlSerializableインターフェースを実装することです。

[CollectionDataContract(Name = "Kenan", ItemName="Items", KeyName="Row", Namespace="spell", ValueName="Values")]
public class CustomRowList : Dictionary<RowXML, List<ColumnXML>>, IXmlSerializable 
{

}

詳細はこちらをご覧ください

IXmlSerializableを実装する適切な方法は?

于 2012-05-08T14:19:50.530 に答える