有人告诉我,包含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"};
问题:
new
Item
我发现如果该类不是代理类,我就无法在没有构造函数的情况下创建对象。
答案 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 instance,but still requires a parameterless constructor。
如果找不到无参数构造函数,它就无法实例化该对象。嗯,它可以,但它没有。因此,如果您要在服务操作中实际使用此Item
类:
public void SomeOperation(Item item)
{
}
然后,当您从客户端调用此操作时,WCF将抛出异常,因为序列化程序无法在Item
上找到无参数构造函数。