2010-05-20 23 views
0

我在使用DataContractSerializer時看到一些不尋常的行爲。我已經定義了一個合同的消息,像這樣:WCF 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消息將無法解析這個。所以我想我有兩個問題:

  1. 爲什麼DataContractSerializer的 增加額外的外部節點到我的 XML輸出?
  2. 有沒有辦法阻止它做 這個?

謝謝。

我也許應該補充這與.NET 4

回答

0

你可以嘗試使用WriteObjectContent,而不是WriteObject,但我無法使用您提供的代碼重現您的問題。所有額外的類defintions是您的留言合同的一部分是在我的定義空的,但是這是我收到的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中的結果相同。

+0

我的MessageContract中的子元素都由具有DataContract/DataMember屬性的類定義。 – sbanwart 2010-05-20 18:02:01

+0

我在原貼中糊了粘貼。在某些名稱空間中有一個額外的「http://」。試試這個。 http://pastebin.com/FqBGVGLK – sbanwart 2010-05-20 18:18:59

+0

@sbanwart:我瘋狂起來:)我不小心粘貼了我的程序類中的所有類......我現在得到的結果與.NET 3.5中的結果完全相同。 PS:斜槓不需要在常規字符串中轉義,這只是反斜槓。所以沒有'@'需要。 – Thorarin 2010-05-20 18:28:46

相關問題