在使用DataContractSerializer时,我看到了一些不寻常的行为。我已经定义了这样的消息契约:
namespace MyNamespace.DataContracts
{
[MessageContract(WrapperName = "order", WrapperNamespace = @"http://example.com/v1/order")]
public class MyOrder
{
[MessageBodyMember(Namespace = @"http://example.com/v1/order", Order = 1)]
public MyStore store;
[MessageBodyMember(Namespace = @"http://example.com/v1/order", Order = 2)]
public MyOrderHeader orderHeader;
[MessageBodyMember(Namespace = @"http://example.com/v1/order", Order = 3)]
public List<MyPayment> payments;
[MessageBodyMember(Namespace = @"http://example.com/v1/order", Order = 4)]
public List<MyShipment> shipments;
}
.
.我向它发送的XML消息如下所示:
<?xml version="1.0" encoding="utf-8"?>
<order xmlns="http://example.com/v1/order>
<store>
...
</store>
<orderHeader>
...
</orderHeader>
<payments>
<payment>
...
</payment>
</payments>
<shipments>
<shipment>
...
</shipment>
</shipments>
</order>我的服务按照预期对这个XML进行反序列化。在我的服务中,我使用DataContractSerializer来创建XML,这就是事情变得奇怪的地方。我使用的序列化程序如下:
DataContractSerializer serializer = new DataContractSerializer(typeof(MyOrder));
using (MemoryStream ms = new MemoryStream())
{
serializer.WriteObject(ms, order);
ms.Position = 0;
StreamReader sr = new StreamReader(ms);
string outputMessage = sr.ReadToEnd();
}完成后,outputMessage包含以下XML:
<?xml version="1.0" encoding="utf-8"?>
<MyOrder xmlns="http://example.com/v1/order" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<order>
<store>
...
</store>
<orderHeader>
...
</orderHeader>
<payments>
<payment>
...
</payment>
</payments>
<shipments>
<shipment>
...
</shipment>
</shipments>
</order>
</MyOrder>不用说,任何期望接收原始XML消息的东西都不能解析这一点。所以我想我有两个问题:
谢谢。
我应该补充一下,这是在.NET 4中实现的。
发布于 2010-05-20 17:42:28
您可以尝试使用WriteObjectContent而不是WriteObject,但我无法使用您提供的代码再现您的问题。在我的定义中,作为消息契约一部分的所有额外的类定义都是空的,但这是我得到的XML:
<MyOrder xmlns="http://schemas.datacontract.org/2004/07/SandboxApp"
xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<orderHeader i:nil="true"/>
<payments i:nil="true"/>
<shipments i:nil="true"/>
<store i:nil="true"/>
</MyOrder>这似乎也很奇怪,因为它似乎忽略了WrapperName。.NET 3.5 SP1和.NET 4.0的结果相同。
https://stackoverflow.com/questions/2876178
复制相似问题