2013-03-06 49 views
4

服务代码:WCF不反序列化值类型。神秘的行为

[ServiceContract] 
    public interface IServices 
    { 
     [OperationContract] 
     [XmlSerializerFormat] 
     GetProductsResponse Getproducts(GetProductsRequest productsrequest); 

    [OperationContract] 
    SaveProductsResponse SaveProducts1(SaveProductsRequest1 productsrequest); 
} 


public class GetProductsRequest 
{ 
    [XMLElement] 
    public string id; 

    [XMLElement,typeof(Person)] 
    public Person[] Persons; 
} 

[DataContract] 
public class SaveProductsRequest1 
{ 
    [DataMember] 
    public List<Person> Persons; 
} 


[DataContract] 
public class Person 
{ 
    [DataMember] 
    public int Id; 

    [DataMember] 
    public string Name; 

    [DataMember] 
    public Sex Sex; 
} 

[DataContract] 
public enum Sex 
{ 
    [EnumMember] 
    Male, 
    [EnumMember] 
    Female 
} 

客户:

ServicesClient client = new ServicesClient(); 
SaveProductsRequest1 req = new SaveProductsRequest1(); 
req.Persons = new List<Person> { new Person { Id = 10, Name = "Al", Sex = Sex.Female} }.ToArray(); 

client.SaveProducts1(req); 

我能够在服务端来获取值 '基地'(字符串)。但值10和男(值类型)在服务端重置为默认值(0和男)。

这只发生在我为服务合约中的任何一个方法(本例中为GetProducts)以及当我将XMLElement放入任何数组属性和一个附加字符串属性时在我的GetProducts类中使用XmlSerializerFormat时发生。

是否与WCF运行时问题?

+0

请包括Person类 – Aron 2013-03-06 09:12:34

+0

我们可以看看'Person'是如何声明的吗? – 2013-03-06 09:13:17

+0

datacontract是怎么样的? – 2013-03-06 09:13:34

回答

3

我设置使用服务器端代码的测试WCF服务,并再次使用例如客户端代码的测试客户端,它工作得很好:

enter image description here

正如你所看到的,所有3个值都完好无损地传输了1 Person。如果在您的最后发生了不同的事情,它可能可能与您的配置文件中的配置选项有关,但基本上:代码起作用。我正在使用.NET 4.5进行测试

+0

我应该看看你的服务合同吗?因为我的代码也工作正常。只有当我的一个方法具有[XMLSerialzeFormat]属性(在我的情况下,它是Getproducts)时才会出现问题。请发布您的服务合同及其运营合同及其集体成员 – 2013-03-06 09:45:30

+0

@ Al.Net我确切地提供了您的问题的代码;所有我改变的问题是为其他3种类型添加虚存根:'[DataContract] public class SaveProductsResponse {}','[DataContract] public class GetProductsRequest {}'和'[DataContract] public class GetProductsResponse {}'。对于信息我也测试了它没有在2“产品”相关类型的'[DataContract] - 它仍然正常工作。 – 2013-03-06 09:47:13

+0

让我也尝试新的样本Marc – 2013-03-06 09:51:31

0

这只发生在我为服务合约中的任何一个方法(本例中为GetProducts)使用XmlSerializerFormat时。

在这种情况下,WCF使用XmlSerializer来序列化数据。因此,[DataContract][DataMember]均不适用。如果您确实必须使用XmlSerializer,并且需要进一步控制XML序列化,则需要使用其特定属性,例如[XmlElement][XmlAttrribute][XmlIgnore]。这是一个很好的做法是明确的,以避免难以发现的字段或属性的无意重命名中出现的问题:

public class Person 
{ 
    [XmlElement("Id")] 
    public int Id { get; set; } 

    [XmlElement("Name")] 
    public string Name { get; set; } 

    [XmlIgnore] // don't tell the stranger 
    public Sex Sex { get; set; } 
} 

还要注意的是[Serializable]属性无关,与XML序列化和数据契约序列化。其相关的二进制系列化只有

+0

我有2个问题。 我想在getproducts(工作正常)xmlserialization,但保存产品datacontractserialization。我怎么能做到这一点? 所以我不应该在同一个服务合同中使用两个序列化类型在操作合同级别吗? – 2013-03-06 09:32:32

+0

不需要用属性标记它们,也不需要使用属性。假定“元素”,并且字段工作正常 - 这是**完全**支持。 – 2013-03-06 09:35:47

+1

使用XML序列化程序和数据协定序列化程序的两个属性装饰您的成员。 – 2013-03-06 09:36:03

0

是您的服务合同饰有ServiceContract属性:

[ServiceContract] 
public interface IServices 
{ 
    // ... 
} 

我只是希望你不向我们展示了不同的东西在这里。

+0

是的,我确实有ServiceContract。现在编辑它。谢谢 – 2013-03-06 09:34:56

+0

@Al.Net你可以看到,虽然 - 这让我们很难看到正确的事情,如果这些细节被省略) – 2013-03-06 09:45:54

+0

对不起Marc Gravell – 2013-03-06 09:47:04