2016-09-22 61 views
0

我在想這個問題。在谷歌上看了很多,自己做了一些測試,但沒有。WCF DataContract只能在客戶端上?是否在.NET Framework 3.5之後才真正需要?

我正在構建一些廣泛使用的WCF Web服務,它將通過ASMX服務引用從.NET 2.0客戶端調用,一些較新的.NET 4.5.2客戶端認爲WCF服務引用(是的,我讓它們可以通過改變配置文件中的端點)。

經過相當多的研究,我發現的最有用的東西是THIS,它基本上說,在.NET 3.5 SP1之後,基本上不需要指定DataContract,因爲如果你不使用它,框架會照顧它, t指定它,自動爲自定義類創建數據約定。缺點是您必須放棄某些高級功能和自定義設置。

這是真的,因爲我試圖用一些隨機對象做一個.NET 4.5.2的測試項目,所有工作都很好,不需要指定數據合同。

然後我試圖將項目傳遞給.NET 3.0和它仍然與以往的任何數據的合同工作....

而且,從我通過鏈接:

無[數據成員],你不能序列化非公共屬性或 領域

這恰好是不正確的或者

問題是:

1)我可以在單獨的項目上指定DataContract而不是在WCF中? (示例:將DataContract到包含的對象是客戶端和web服務必須交換,並期望WCF服務要明白,該對象是否具有datacontract使用類庫中的對象)

2)爲什麼要使用DataContract如果即使沒有必要,我也不需要花哨的東西?我可以走簡單的路嗎?

3)爲什麼如果我將項目從4.5.2轉換爲3.0,反之亦然WCF繼續無縫工作? .NET 3.5 SP1之前不應該強制DataContract

4)兩者都與DataContract或不,我不斷看到對象的私人領域......而指導方針說我不應該......什麼?

我真的需要第一個答案。

這是我用來做測試

類庫與自定義對象的項目的代碼。這在WCF和一個WinForms測試客戶端

public class MyTestObjs 
{ 

    public class TestObject1 
    { 

     public string Test1 { get; private set; } 
     public List<int> Test2 { get; private set; } 
     private TestObject2 Test3 { get; set; } 

     public TestObject1() 
     { 

      this.Test1 = "HELLO " + new Random().Next(2333); 
      this.Test2 = new List<int> { 1, 2, 3, 43, 544, 64 }; 
      this.Test3 = new TestObject2(); 
     } 
    } 

    private class TestObject2 
    { 

     public string Test1 { get; private set; } 
     public List<int> Test2 { get; private set; } 

     public TestObject2() 
     { 

      this.Test1 = "YYYYYYYY " + new Random().Next(2333); 
      this.Test2 = new List<int> { 1111, 2222, 3333, 4443, 55544, 64344 }; 
     } 
    } 
} 

WCF服務引用公開的方法:

public string ReturnComplexTest1(ComplexObjTest.MyTestObjs.TestObject1 test) 
{ 

    string result = String.Empty; 
    result += test.Test1 + "_____"; 

    foreach (int x in test.Test2) 
    { 
     result += x.ToString() + " - "; 
    } 

    return result; 
} 

public ComplexObjTest.MyTestObjs.TestObject1 ReturnComplexTest1Obj() 
{ 

    return new ComplexObjTest.MyTestObjs.TestObject1(); 
} 

的WinForms測試客戶端與服務參考

public string ReturnComplexTest1(ComplexObjTest.MyTestObjs.TestObject1 test) 
{ 

    string result = String.Empty; 
    result += test.Test1 + "_____"; 

    foreach (int x in test.Test2) 
    { 
     result += x.ToString() + " - "; 
    } 

    return result; 
} 

public ComplexObjTest.MyTestObjs.TestObject1 ReturnComplexTest1Obj() 
{ 

    return new ComplexObjTest.MyTestObjs.TestObject1(); 
} 

你可以從與調試見設置爲.NET 3.0框架,任何地點代碼中沒有DATACONTRACTS的所有項目,這是結果:

screenshot

我沒有'需要指定任何datacontract,我可以看到私人領域......這聽起來不對,但它在4.5.2和3.0 NET框架中完美運行bot。我錯過了什麼?

回答

0

當然可以。您必須在服務合同中添加對單獨項目的引用,並在合同中使用該模型。請記住,合同是定義服務將序列化哪些數據的部分,並且模型可以在其他項目中。

2.由於Framework 3.5 SP1,DataContract不再需要序列化。 DataContract屬性用於指示序列化器可以序列化哪些成員,並向序列化器提供關於如何序列化的一些指令。由於不再需要,合同中的所有公共成員都將被序列化。無論如何,不​​使用DataContrat/DataMember屬性會讓你錯過一些有趣的事情: - 你無法定義名稱空間;
- 您無法根據需要設置成員,請設置其數據類型和其他DataMember級別屬性進行驗證;
- 您無法爲成員設置序列化順序;
- 您無法序列化非公開成員。
因此,取決於您是否需要使用上述某些功能,取決於您是否使用DataContract/DataMember屬性。

,因爲我可以在你的代碼中看到,您已經定義了目標框架,您的客戶端(CallWCFTest項目),而不是在服務器,其中有合同,所以不會影響到系列化。

4.這很奇怪,我認爲你只能在inspector中看到屬性,但是你能否在客戶端使用這些私有成員?

希望它有幫助。

+0

如果對象是由客戶端(和服務)引用的一個單獨的程序,然後在客戶端(和服務)可以看到私有成員和它的領域,但他們不會被*序列*當物體進入通過電線。只有公衆成員纔會。 – Tim

+0

1)好的 2)去點nr。 4) 3)所以這是IIS框架設置?這怎麼可能?我明確指出我想使用3.0。 IIS是否接管並使用自己的框架設置運行3.0代碼? 4)其實我可以打電話給私人會員也來自wcf測試客戶端 –

+0

@Tim這是個玩笑?你的意思是webservice只在本地以這種方式工作?當我把它放在網絡上時,它將無法工作? –

相關問題