WCF DataContractSerializer Behavior
- by sbanwart
I'm seeing some unusual behavior when using the DataContractSerializer. I have defined a message contract like so:
namespace MyNamespace.DataContracts
{
[MessageContract(WrapperName = "order", WrapperNamespace = @"http://example.com/v1/order")]
public class MyOrder
{
    [MessageBodyMember(Namespace = @"http://http://example.com/v1/order", Order = 1)]
    public MyStore store;
    [MessageBodyMember(Namespace = @"http://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;
}
.
.
I'm sending it an XML message that looks like this:
<?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>
My service deserializes this XML as expected. Inside my service, I'm using the DataContractSerializer to create an XML string and that's where things get weird. I'm using the serializer like this:
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();
}
Once this finishes, the outputMessage contains the following 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>
Needless to say, anything expecting to receive the original XML message will fail to parse this. So I guess I have two questions:
Why is the DataContractSerializer
adding the extra outer node to my
XML output?
Is there a way to stop it from doing
this?
Thanks.