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

Zac*_*ith 2 c# wcf constructor

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

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

    public Item() {}

    public Item(string description)
    {
        this.description = description;
    }
}
Run Code Online (Sandbox Code Playgroud)

并且告诉我的原因是这允许使用setter构造对象.但是,我发现Item定义如下:

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

    public Item(string description)
    {
        this.description = description;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Item item = new Item {description = "Some description"};
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 在声明之后我正在编写的代码块究竟是什么? new Item
  2. [DataContract]类是否需要空白构造函数?如果是这样,这个空白构造函数做了什么?

我发现如果类不是代理类,我不能在没有构造函数的情况下创建对象.

Cod*_*ter 6

我正在编写的代码块究竟是什么?

Item item = new Item {description = "Some description"};
Run Code Online (Sandbox Code Playgroud)

是相同的,并编译为:

Item item = new Item();
item.description = "Some description";
Run Code Online (Sandbox Code Playgroud)

所以它需要一个无参数的构造函数.如果该类没有,但具有参数化类,则必须使用该类:

Item item = new Item("Some description");
Run Code Online (Sandbox Code Playgroud)

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

Item item = new Item(description: "Some description");
Run Code Online (Sandbox Code Playgroud)

您仍然可以将其与对象初始化程序语法结合使用:

var item = new Item("Some description")
{
    Foo = "bar"
};
Run Code Online (Sandbox Code Playgroud)

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

是.默认的序列化程序DataContractSerializer 不使用反射来实例化新实例,但仍需要无参数构造函数.

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

public void SomeOperation(Item item)
{
}
Run Code Online (Sandbox Code Playgroud)

一旦从客户端调用此操作,WCF将抛出异常,因为序列化程序无法找到无参数构造函数Item.

  • 如果一个类根本不包含构造函数,则会自动生成一个无参数的函数(参见:https://msdn.microsoft.com/en-us/library/aa645608(v = vs.71).aspx). (2认同)
  • `是的.序列化程序使用反射来实例化一个新实例,并使用无参数构造函数来实现.但事实并非如此.在WCF中,一些黑魔法用于创建对象的实例.另见http://stackoverflow.com/questions/1076730/datacontractserializer-doesnt-call-my-constructor (2认同)