2016-09-22 109 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只在本地以这种方式工作?当我把它放在网络上时,它将无法工作? –

相关问题