让WCF / svcutil.exe自动生成类代码:
public class Foo
{
private float barField;
bool barFieldSpecified;
public float bar
{
get
{
return this.barField;
}
set
{
this.barField = value;
}
}
[System.Xml.Serialization.SoapIgnore]
public bool barSpecified
{
get
{
return this.barFieldSpecified;
}
set
{
this.barFieldSpecified = value;
}
}
}
并使用XMLSerializer:
Foo foo = new Foo();
foo.bar = 100;
var ser = new XmlSerializer(typeof(Foo));
var ms = new MemoryStream();
ser.Serialize(ms, foo);
var str = Encoding.UTF8.GetString(ms.ToArray());
我使用设置为'false'的所有节点中的值获取XML,并且没有设置我的类属性。
答案 0 :(得分:0)
此类行为的原因是XMLSerializer在上面的代码中使用这些附加属性以“指定”关键字结尾,用于值类型属性,如bar
和barSpecified
。如果barSpecified
未设置为“true”,则bar
属性将不会被序列化。这是XMLSerializer的说法,bar
是一种NULL,不应该被序列化。
解决这个问题至少有3种可能性:
- 删除barSpecified
属性和字段
- 将barSpecified
设置为'true'
-if类实现INotifyPropertyChanged
使用它(如果类是自动生成的,最好将它作为另一个文件中的部分类,如下所示):
public partial class Foo
{
public Foo()
{
this.PropertyChanged += (object sender, System.ComponentModel.PropertyChangedEventArgs e) =>
{
if (!e.PropertyName.EndsWith("Specified"))
{
var prop = this.GetType().GetProperty(e.PropertyName + "Specified");
if (prop != null)
prop.SetValue(this, true, null);
}
};
}
}