使用DataContractSerializer进行自定义序列化

时间:2009-06-11 12:16:28

标签: c# serialization datacontractserializer

我正在研究使用DataContractSerializer,但我无法获得正确的输出格式。 DataContractSerializer序列化以下类

[DataContract(Name = "response")]
public class MyCollection<T> 
{
    [DataMember]
    public List<T> entry { get; set; }
    [DataMember]
    public int index { get; set; }
}

<response><entry><T1>object1</T1><T2>object2</T2></entry><index></index></response>

但我想要的是

<response><entry><T1>object1</T1></entry><entry><T2>object2</T2></entry><index></index></response>

如何使用DataContractSerializer执行此操作?但是还要维护DataContractJsonSerializer的第一个输出?

2 个答案:

答案 0 :(得分:4)

基于这篇文章,似乎DataContractSerializer不支持自定义生成的xml。

http://www.danrigsby.com/blog/index.php/2008/03/07/xmlserializer-vs-datacontractserializer-serialization-in-wcf/

从MS网站上有一个重要的注意事项: 'DataContractAttribute属性不应该应用于已经实现ISerializable接口的类或者使用SerializableAttribute标记的类。如果您尝试序列化此类型的实例,则会抛出异常。'

PS:抱歉,我无法发布第二个链接,但引擎不允许向新用户发布多个链接。

此致 Herberth

答案 1 :(得分:1)

如果您正在编写xml,我想知道xml序列化程序是不是更好的选择(它对名称有更精细的控制等)。

问题是,XmlSerializer并不总是泛型的最大粉丝......

此外 - 尝试了一些涉及[XmlArray] / [XmlArrayItem等等的选项...看起来很难达到你想要的格式......再加上它不容易猜到你的意思是T1 / T2 - 但以下内容可能会接近:

[XmlRoot("response")]
public class MyResponse : MyCollection<int> { }

[DataContract(Name = "response")]
public class MyCollection<T>
{
    [DataMember]
    [XmlElement("entry")]
    public List<T> entry { get; set; }
    [DataMember]
    public int index { get; set; }
}

这有XmlSerializerDataContractSerializer属性,但我不得不丢失我们用于响应的类型的泛型(因此“封闭”MyResponse类型)