WCF [DataContract]类是否需要空白构造函数?为什么?

时间:2017-02-01 10:07:46

标签: c# wcf constructor

有人告诉我,包含getter和setter的可序列化对象需要一个空白构造函数,如下所示:

[DataContract]
public class Item
{
    [DataMember]
    public string description { get; set; }

    public Item() {}

    public Item(string description)
    {
        this.description = description;
    }
}

之所以告诉我这是因为这允许使用setter构建对象。但是,我发现项目定义如下:

[DataContract]
public class Item
{
    [DataMember]
    public string description { get; set; }

    public Item(string description)
    {
        this.description = description;
    }
}

当通过WCF服务引用作为代理类提供时,可以在不调用构造函数的情况下构造:

Item item = new Item {description = "Some description"};

问题:

  1. 宣布new Item
  2. 之后我写的代码块到底是什么?
  3. [DataContract]类需要空白构造函数吗?如果是这样,这个空白构造函数会做什么?
  4. 我发现如果该类不是代理类,我就无法在没有构造函数的情况下创建对象。

1 个答案:

答案 0 :(得分:6)

  

我写的那段代码究竟是什么

Item item = new Item {description = "Some description"};

相同并编译为:

Item item = new Item();
item.description = "Some description";

所以它需要一个无参数的构造函数。如果班级没有,但有一个参数化的,你必须使用那个:

Item item = new Item("Some description");

使用命名参数,它看起来像这样:

Item item = new Item(description: "Some description");

您仍然可以将其与对象初始值设定项语法结合使用:

var item = new Item("Some description")
{
    Foo = "bar"
};
  

[DataContract]类需要空白构造函数吗?

是。默认序列化程序DataContractSerializer,doesn't use reflection to instantiate a new instancebut still requires a parameterless constructor

如果找不到无参数构造函数,它就无法实例化该对象。嗯,它可以,但它没有。因此,如果您要在服务操作中实际使用此Item类:

public void SomeOperation(Item item)
{
}

然后,当您从客户端调用此操作时,WCF将抛出异常,因为序列化程序无法在Item上找到无参数构造函数。