首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WCF DataContractSerializer行为

WCF DataContractSerializer行为
EN

Stack Overflow用户
提问于 2010-05-20 17:16:25
回答 1查看 1.4K关注 0票数 0

在使用DataContractSerializer时,我看到了一些不寻常的行为。我已经定义了这样的消息契约:

代码语言:javascript
复制
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消息如下所示:

代码语言:javascript
复制
<?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,这就是事情变得奇怪的地方。我使用的序列化程序如下:

代码语言:javascript
复制
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:

代码语言:javascript
复制
<?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消息的东西都不能解析这一点。所以我想我有两个问题:

  1. 为什么DataContractSerializer要将额外的外部节点添加到XML输出中?
  2. 有办法阻止它这样做吗?

谢谢。

我应该补充一下,这是在.NET 4中实现的。

EN

回答 1

Stack Overflow用户

发布于 2010-05-20 17:42:28

您可以尝试使用WriteObjectContent而不是WriteObject,但我无法使用您提供的代码再现您的问题。在我的定义中,作为消息契约一部分的所有额外的类定义都是空的,但这是我得到的XML:

代码语言:javascript
复制
<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的结果相同。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2876178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档