2

我正在考虑使用 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 的第一个输出?

4

2 回答 2

4

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

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

从 MS 站点有一个重要说明:'DataContractAttribute 属性不应应用于已经实现 ISerializable 接口或标有 SerializableAttribute 的类。如果您尝试序列化此类类型的实例,则会引发异常。

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

问候,赫伯斯

于 2009-07-14T23:57:39.460 回答
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类型)

于 2009-06-11T12:22:16.963 回答