我有一个REST-ful WCF服务,它返回一个XML响应。它由正确序列化和反序列化的对象组成,但有一个例外是节点上的List属性未正确反序列化。 XML看起来像:
<ShippingGroups>
<ShippingGroup>
<ShippingGroupId>
b0b4d8a4-ff1f-4f02-a47c-263ef8ac861b</ShippingGroupId>
<ShippingAddressId>
63c0b52c-b784-4c27-a3e8-8adafba36add</ShippingAddressId>
<LineItemIds xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
<a:string>ccc0f986-52d5-453e-adca-8ff4513c1d84</a:string>
</LineItemIds>
</ShippingGroup>
问题出现了,因为我反序列化这个XML的C#类需要一个List LineItemIds。我可以通过手动删除该命名空间并删除它来解决这个问题。
还有另一种解决方法吗,这样看起来像是:
<ShippingGroups>
<ShippingGroup>
<ShippingGroupId>
b0b4d8a4-ff1f-4f02-a47c-263ef8ac861b</ShippingGroupId>
<ShippingAddressId>
63c0b52c-b784-4c27-a3e8-8adafba36add</ShippingAddressId>
<LineItemIds>
<string>ccc0f986-52d5-453e-adca-8ff4513c1d84</string>
</LineItemIds>
</ShippingGroup>
答案 0 :(得分:1)
我想我有一个答案。如果没有看到您的DataContracts
,我就会猜测您正在使用什么以及您的数据结构如何。但是这里......
我正在使用VS2010,C#,WCF REST和.NET 4。
默认情况下,您的集合或数组使用默认命名空间,以便在序列化时保持互操作性。因此,您的序列化行为符合设计。
如果您创建自定义集合并在其上使用CollectionDataContract
属性,则可以解决此问题。然后,您可以更好地控制它的序列化方式,包括其命名空间。这是来自MSDN的detailed explanation。
所以我创建了一个自定义集合并使用CollectionDataContract
命名空间:
[CollectionDataContract(Namespace="")]
public class StringItem2 : Collection<string>
{
}
没有属性,因为此集合只包含字符串。
然后我的DataContract
包含我的自定义字符串集合:
[DataContract(Namespace="", IsReference=false)]
public class SampleItem
{
[DataMember]
public int Id { get; set; }
[DataMember]
public string StringValue { get; set; }
[DataMember]
public StringItem2 StringItems2 { get; set; }
}
现在我已经完成了,我有简单的WCF RESTful服务(GET):
[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class Service1
{
[WebGet(UriTemplate = "{id}")]
public SampleItem Get(string id)
{
SampleItem si = new SampleItem()
{
Id = 10,
StringValue = "foo",
StringItems2 = new StringItem2() { "Hola", "como", "esta", "usted" }
};
return si;
}
}
当我请求此服务(http://localhost:xxxx/Service1/10)时,我得到以下XML作为响应:
<SampleItem xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Id>10</Id>
<StringItems2>
<string>Hola</string>
<string>como</string>
<string>esta</string>
<string>usted</string>
</StringItems2>
<StringValue>foo</StringValue>
</SampleItem>
希望这会有所帮助。如果我错过了其他详细信息或者问题还有什么,请告诉我。我会相应地更新我的答案。