Xml REST-ful WCF服务:反序列化C#字符串列表工作不正常
我有一个REST-ful WCF服务,它返回XML响应。它由正确序列化和反序列化的对象组成,唯一的例外是节点上的“我的列表”属性未正确反序列化。XML看起来像:Xml REST-ful WCF服务:反序列化C#字符串列表工作不正常,xml,wcf,rest,serialization,Xml,Wcf,Rest,Serialization,我有一个REST-ful WCF服务,它返回XML响应。它由正确序列化和反序列化的对象组成,唯一的例外是节点上的“我的列表”属性未正确反序列化。XML看起来像: <ShippingGroups> <ShippingGroup> <ShippingGroupId> b0b4d8a4-ff1f-4f02-a47c-263ef8ac861b</ShippingGroupId> <ShippingAddressId> 63c0b
<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>
b0b4d8a4-ff1f-4f02-a47c-263ef8ac861b
63c0b52c-b784-4c27-a3e8-8adafba36add
ccc0f986-52d5-453e-adca-8ff4513c1d84
出现问题的原因是,用于反序列化此XML的C#类需要一个列表lineItemId。我可以通过手动删除该名称空间并删除
有没有其他方法可以解决这个问题,比如:
<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>
b0b4d8a4-ff1f-4f02-a47c-263ef8ac861b
63c0b52c-b784-4c27-a3e8-8adafba36add
ccc0f986-52d5-453e-adca-8ff4513c1d84
我想我有一个答案给你。没有看到您的
数据契约
,我只是在猜测您在使用什么以及数据的结构。但这是
为此,我使用VS2010、C#、WCF REST和.NET 4
默认情况下,集合或数组使用默认命名空间,以便在序列化时保持互操作性。因此,序列化的行为符合设计要求
如果您创建一个自定义集合并对其使用CollectionDataContract
属性,则可以绕过此问题。然后,您可以更好地控制它的序列化方式,包括其名称空间。这里有一个来自MSDN的关于这个的例子
因此,我创建了一个自定义集合,并使用CollectionDataContract
名称空间:
[CollectionDataContract(Namespace="")]
public class StringItem2 : Collection<string>
{
}
现在我已经完成了,我有了简单的WCF RESTful服务(GET):
当我请求此服务()时,我得到以下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>
10
赫拉
科莫
埃斯塔
乌斯特
福
希望这能有所帮助。请让我知道是否有我遗漏的其他细节,或者是否有更多的问题。我会相应地更新我的答案。我想我有一个答案给你。没有看到您的
数据契约
,我只是在猜测您在使用什么以及数据的结构。但这是
为此,我使用VS2010、C#、WCF REST和.NET 4
默认情况下,集合或数组使用默认命名空间,以便在序列化时保持互操作性。因此,序列化的行为符合设计要求
如果您创建一个自定义集合并对其使用CollectionDataContract
属性,则可以绕过此问题。然后,您可以更好地控制它的序列化方式,包括其名称空间。这里有一个来自MSDN的关于这个的例子
因此,我创建了一个自定义集合,并使用CollectionDataContract
名称空间:
[CollectionDataContract(Namespace="")]
public class StringItem2 : Collection<string>
{
}
现在我已经完成了,我有了简单的WCF RESTful服务(GET):
当我请求此服务()时,我得到以下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>
10
赫拉
科莫
埃斯塔
乌斯特
福
希望这能有所帮助。请让我知道是否有我遗漏的其他细节,或者是否有更多的问题。我将相应地更新我的答案。如何反序列化消息。该命名空间是由数据协定序列化程序添加的。如果您还可以显示如何定义数据协定,这可能会有所帮助。如何反序列化消息。该名称空间是由数据协定序列化程序添加的。如果您还可以展示如何定义数据协定,这可能会有所帮助。