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消息將無法解析這個。所以我想我有兩個問題:
- 爲什麼DataContractSerializer的 增加額外的外部節點到我的 XML輸出?
- 有沒有辦法阻止它做 這個?
謝謝。
我也許應該補充這與.NET 4
我的MessageContract中的子元素都由具有DataContract/DataMember屬性的類定義。 – sbanwart 2010-05-20 18:02:01
我在原貼中糊了粘貼。在某些名稱空間中有一個額外的「http://」。試試這個。 http://pastebin.com/FqBGVGLK – sbanwart 2010-05-20 18:18:59
@sbanwart:我瘋狂起來:)我不小心粘貼了我的程序類中的所有類......我現在得到的結果與.NET 3.5中的結果完全相同。 PS:斜槓不需要在常規字符串中轉義,這只是反斜槓。所以沒有'@'需要。 – Thorarin 2010-05-20 18:28:46