将List <t>与WCF Rest服务</t>一起使用时的ArrayOf

时间:2010-06-21 20:07:08

标签: .net list wcf rest

我正在尝试使用.NET 4.0和WCF创建REST Web服务。我的REST服务正在返回一个List,然后将其序列化为XML。我遇到的问题是返回的XML以ArrayOf开头,我不喜欢。

换句话说,现在XML看起来像这样:

<ArrayOfAchievement>
    <Achievement>
        ...
    </Achievement>
</ArrayOfAchievement>

我希望XML看起来像这样:

<Achievements>
    <Achievement>
        ...
    </Achievement>
</Achievements>

如果我创建一个新类并将其命名为AchievementsList,其属性为List&lt;成就&gt;,如下:

public class AchievementsList
{
    public List<Achievement> Achievements { get; set; }
}

然后我的服务返回上面的类而不是List&lt;成就&gt;,XML最终看起来像这样:

<AchievementsList>
    <Achievements>
        <Achievement>
            ...
        </Achievement>
    </Achievements>
</AchievementsList>

哪个错误(因为它增加了不属于那里的另一个级别)。

另一个问题是我还需要在对象中应用命名空间,如下所示:

[XmlRoot(Namespace="NameSpaceURL")]
public class AchievementsList
{
    public List<Achievement> Achievements { get; set; }
}

如果我只返回一个List&lt;成就&GT;

那么我可以对这两个问题做些什么呢?

巴拉

3 个答案:

答案 0 :(得分:4)

  1. 您使用AchievementList类走在正确的轨道上,但您需要做的是使用Achievements属性修饰XmlElement list属性,并提供各个元素的名称。

  2. 命名空间在AchievementList类上,就像你拥有它一样。

  3. 示例代码:

    [Serializable]
    public class Achievement {
        public string Name { get; set; }
    }
    
    [Serializable]
    [XmlRoot(ElementName="Achievements", Namespace="http://www.mynamespace.com")]
    public class AchievementList
    {      
        [XmlElement("Achievement")]
        public List<Achievement> Achievements { get; set; }
    
        public AchievementList()
        {
            Achievements = new List<Achievement>();
        }
    
        public void Add(Achievement a)
        {
            Achievements.Add(a);
        }
    }
    

    您的输出将是:

    <?xml version="1.0" encoding="utf-16"?>
    <Achievements xmlns="http://www.mynamespace.com">
      <Achievement>
        <Name>Woke Up</Name>
      </Achievement>
      <Achievement>
        <Name>Went to work</Name>
      </Achievement>
      <Achievement>
        <Name>Slacked off</Name>
      </Achievement>
    </Achievements>}
    

答案 1 :(得分:1)

我有类似的设置:从AchievementsList派生List<Achievement>,使用XmlTypeAttributeXmlRootAttribute进行装饰,并使用Achievement装饰XmlTypeAttribute [XmlType(TypeName = "Achievements", Namespace="http://www.mynamespace.com")] [XmlRoot(ElementName = "Achievements", Namespace="http://www.mynamespace.com")] public class AchievementsList : List<Achievement> { } [XmlType(TypeName = "Achievement", Namespace="http://www.mynamespace.com")] public class Achievement { ... }

XmlSerializerFormat

我还使用DataContract属性修饰了我的服务实现,因此我可以避免通常的{{1}}序列化。

答案 2 :(得分:1)

我问了related question如何反序列化返回List<SomeType>的WCF Web服务方法生成的XML。

XML有一个名为<ArrayOfSomeType>的根,为了将其反序列化为List<SomeType>,必须使用DataContractSerializer而不是XmlSerializer,因为它们不兼容。< / p>