2010-01-12 173 views
1

我的“Location”对象在我的WCF数据合同中没有被序列化,但是,所有其他变量都被正确设置。当我尝试输出变量的位置对象,我得到了“对象引用不设置到对象的实例”错误WCF反序列化问题

我DataContract:

[DataContract(Namespace = "")] 
public class CalcRequest : BaseRequest 
{ 
    [DataMember(Name = "Products")] 
    public List<Product> products; 

    [DataMember(Name = "Location")] 
    public Location location; 

    [DataMember(Name = "ShippingMethod")] 
    public string shippingMethod; 

    [DataMember(Name = "SystemPromotionCode")] 
    public string systemPromotionCode; 

    [DataMember(Name = "UserPromotionCode")] 
    public string userPromotionCode; 
} 

“位置”对象:

[DataContract(Name = "Location", Namespace = "")] 
public class Location 
{ 
    public Location() 
    { 
     // do nothing 
    } 

    [DataMember(Name = "Country")] 
    public string country; 

    [DataMember(Name = "StateProvince")] 
    public string stateProvince; 

    [DataMember(Name = "PostalCode")] 
    public string postalCode; 
} 

我的XML请求(版本,信息类型,processorID和客户ID是在我的 “BaseRequest”):

<root> 
    <Version>1.0</Version> 
    <MsgType>type</MsgType> 
    <ProcessorId>28000</ProcessorId> 
    <CustomerId>28000</CustomerId> 
    <Products> 
     <Product> 
      <SKU>1</SKU> 
      <Price>2999</Price> 
      <ProductName>name1</ProductName> 
      <Quantity>1</Quantity> 
     </Product> 
     <Product> 
      <SKU>2</SKU> 
      <Price>1999</Price> 
      <ProductName>name2</ProductName> 
      <Quantity>1</Quantity> 
     </Product> 
    </Products> 
    <Location> 
     <Country>US</Country> 
     <StateProvince>OH</StateProvince> 
     <PostalCode>44060</PostalCode> 
    </Location> 
    <ShippingMethod>USPS-NextDay</ShippingMethod> 
    <SystemPromotionCode>CD1244578</SystemPromotionCode> 
    <UserPromotionCode>2FDGRR</UserPromotionCode> 
</root> 

...不知道为什么这不工作...任何帮助将不胜感激。

+0

您的XML请求的其余部分是什么样的? – 2010-01-12 16:08:54

+0

更新我的问题与完整的请求 – 2010-01-12 16:14:58

回答

3

我不明白你在想什么缺失,真的....

(东东删除 - 不相关)

UPDATE:,以确保在XML元素的顺序是正确的,正确的顺序解释,你可能想Order=xxx声明按字母顺序(比XmlSe其他添加到数据成员属性 -

否则,数据合同串行器将序列(和反序列化)rializer按序出现字段序列化)。

字母顺序是区分大小写的,在任何小写字符之前考虑任何大写字母。

如果您有多个相同顺序的元素(这不是问题),那么它们将按照它们的顺序按字母顺序排列(例如Order = 1的所有元素都将按照字母顺序排列 - 然后所有元素订单= 2等)。

对于派生类,基类的属性将先后(按字母顺序)和派生类的属性(也按字母顺序排列)序列化。

+0

我想我希望有人能够发现一个公然的问题。当我尝试Debug.WriteLine(request.location.country);它表示“对象引用未设置为对象的实例” – 2010-01-12 16:31:07

+0

因此,当您查看WriteLine函数中的对象时,处于调试模式时,哪一个为空? – 2010-01-12 16:32:39

+0

@marc_s是的,将我的xml转换为对象的过程似乎是问题......但仅适用于Location对象,因为我可以访问所有其他对象 – 2010-01-12 16:39:19