当前位置: 首页 > 知识库问答 >
问题:

WCF[数据合约]类是否需要空白构造函数?为什么啊?

归翔
2023-03-14

有人告诉我,包含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. 在声明新项目后,我正在编写的代码块到底是什么
  2. [DataContract]类是否需要空白构造函数?如果是,这个空构造函数做什么

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


共有1个答案

葛言
2023-03-14

我写的这段代码到底是什么

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"
};

[数据合约]类是否需要空白构造函数?

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

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

public void SomeOperation(Item item)
{
}

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

 类似资料:
  • 问题内容: 我有两个类,和,扩展了前一个类。 具有以下构造函数: 我将注意到所有实例变量都已设置为private。 同时,具有以下构造函数: 但是,这为我的构造函数引发了“找不到符号”错误。 我尝试使用,但是我的超类的私有范围阻止了这种情况。 我发现向我的构造函数中添加字段并允许我调用超级构造函数,但是我想知道是否存在一种无需在子类构造函数中传递其所有参数的情况下调用超级构造函数的方法? 问题答案

  • 问题内容: 必须使用无参数构造函数(像Hibernate这样的工具会在此构造函数上使用反射来实例化对象)。 我得到了这个手挥手的答案,但是有人可以进一步解释吗?谢谢 问题答案: hibernate,并且通常通过反射创建对象的代码用于创建类的新实例。此方法需要一个公共的无参数构造函数才能实例化该对象。对于大多数用例,提供无参数构造函数不是问题。 有一些基于序列化的技巧可以解决没有no-arg构造函数

  • 问题内容: 我对此代码有疑问:https : //github.com/reactjs/redux/blob/master/examples/async/containers/App.js 特别: 我猜这是一个两部分的问题。 为什么我需要将句柄更改设置为类的实例,我不能只对handleChange使用静态函数并直接在类中调用它 ? 我不知道这是怎么回事: 谢谢 问题答案: 以相反的顺序回答… 返回

  • 我目前正在学习Java的继承,我在理解它方面遇到了很大的困难,但是我不能理解的一个主要问题是为什么在下面的示例中有必要调用一个超类构造函数,它有什么帮助?此示例来自Oracle的方法教程。 我最初的想法是,会缩短当前构造函数中参数的代码,它只会接受父类中传入的值并将其添加到子类中(如下所示): 但是,正如我已经知道的那样,这是错误的,并且再次将我带到了真正做什么的问题上。我会非常感谢一些形式的解释

  • 我问这个问题是因为在Python和Java中,如果父类构造函数需要0参数,则不需要调用super()。 Javascript 蟒蛇 Java

  • 问题内容: 这对您来说可能听起来很愚蠢,但是为什么我需要在s中定义一个空的构造函数? 我看到的每个教程都说:每个实体都需要一个空的构造函数。 但是Java总是给您一个默认的不可见的空构造函数(如果您不重新定义一个的话)。 谢谢。 我认为这是一个语义问题。我所理解的“需求”是书面的。 含义:始终在您的实体中编写一个空的构造函数。 例: 但是,当您不重新定义Java时,Java总是会为您提供一个空的构