如何使用DataContractSerializer格式化IDictionary的序列化?

时间:2012-05-08 08:41:28

标签: c# .net xml-serialization datacontractserializer

我使用以下代码从对象序列化/反序列化到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一起使用,我有以下自定义Dictionary类:

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

}

问题是,当代码输出我的

Dictionary<RowXML, List<ColumnXML>>

它看起来像这样:

enter image description here

我不需要<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]

属性为空白,但这不起作用。

1 个答案:

答案 0 :(得分:2)

看起来,您想要自定义集合类的xml输出。实现此预期输出的唯一方法是实现IXmlSerializable接口,如下所示。

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

}

请在此处查看更多信息

Proper way to implement IXmlSerializable?

相关问题