2013-03-06 61 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