【发布时间】:2009-11-05 12:47:57
【问题描述】:
我有一个 WCF DataContract,如下所示:
namespace MyCompanyName.Services.Wcf
{
[DataContract(Namespace = "http://mycompanyname/services/wcf")]
[Serializable]
public class DataContractBase
{
[DataMember]
public DateTime EditDate { get; set; }
// code omitted for brevity...
}
}
当我在 Visual Studio 中添加对该服务的引用时,会生成此代理代码:
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "2.0.50727.3082")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://mycompanyname/services/wcf")]
public partial class DataContractBase : object, System.ComponentModel.INotifyPropertyChanged {
private System.DateTime editDateField;
private bool editDateFieldSpecified;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Order=0)]
public System.DateTime EditDate {
get {
return this.editDateField;
}
set {
this.editDateField = value;
this.RaisePropertyChanged("EditDate");
}
}
/// <remarks/>
[System.Xml.Serialization.XmlIgnoreAttribute()]
public bool EditDateSpecified {
get {
return this.editDateFieldSpecified;
}
set {
this.editDateFieldSpecified = value;
this.RaisePropertyChanged("EditDateSpecified");
}
}
// code omitted for brevity...
}
如您所见,除了为EditDate 生成一个支持属性外,还生成了一个额外的<propertyname>Specified 属性。一切都很好,除了当我执行以下操作时:
DataContractBase myDataContract = new DataContractBase();
myDataContract.EditDate = DateTime.Now;
new MyServiceClient.Update(new UpdateRequest(myDataContract));
EditDate 未被服务端点接收(未出现在传输的 XML 中)。
我调试了代码,发现虽然我设置了EditDate,但EditDateSpecified 属性并没有像我预期的那样设置为true;因此,XML 序列化程序忽略了 EditDate 的值,即使它设置为有效值。
作为一个小技巧,我修改了EditDate 属性,如下所示:
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Order=0)]
public System.DateTime EditDate {
get {
return this.editDateField;
}
set {
this.editDateField = value;
// hackhackhack
if (value != default(System.DateTime))
{
this.EditDateSpecified = true;
}
// end hackhackhack
this.RaisePropertyChanged("EditDate");
}
}
现在代码按预期工作,但当然每次我重新生成代理时,我的修改都会丢失。我可以将调用代码更改为以下内容:
DataContractBase myDataContract = new DataContractBase();
myDataContract.EditDate = DateTime.Now;
myDataContract.EditDateSpecified = true;
new MyServiceClient.Update(new UpdateRequest(myDataContract));
但这似乎也有点浪费时间。
最后,我的问题是:是否有人对如何克服 Visual Studio 服务代理生成器的这种不直观(和 IMO 损坏)的行为提出建议,还是我只是遗漏了什么?
【问题讨论】:
-
将
[XMLSerializerFormat]添加到您服务的属性中:选中此answer -
如果你从@MustafaMagdy 的评论中复制/粘贴——它是
[XmlSerializerFormat](注意大小写)