我在想這個問題。在谷歌上看了很多,自己做了一些測試,但沒有。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的所有項目,這是結果:
我沒有'需要指定任何datacontract,我可以看到私人領域......這聽起來不對,但它在4.5.2和3.0 NET框架中完美運行bot。我錯過了什麼?
如果對象是由客戶端(和服務)引用的一個單獨的程序,然後在客戶端(和服務)可以看到私有成員和它的領域,但他們不會被*序列*當物體進入通過電線。只有公衆成員纔會。 – Tim
1)好的 2)去點nr。 4) 3)所以這是IIS框架設置?這怎麼可能?我明確指出我想使用3.0。 IIS是否接管並使用自己的框架設置運行3.0代碼? 4)其實我可以打電話給私人會員也來自wcf測試客戶端 –
@Tim這是個玩笑?你的意思是webservice只在本地以這種方式工作?當我把它放在網絡上時,它將無法工作? –