gpt4 book ai didi

c# - XMLSerializer 不序列化类属性,只返回 bool - 'false' *指定成员的值

转载 作者:行者123 更新时间:2023-12-04 05:15:53 25 4
gpt4 key购买 nike

像这样由 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());

我得到的 XML 中所有节点的值都设置为“false”,但我没有设置任何类属性。

最佳答案

这种行为的原因是 XMLSerializer 使用这些以“Specified”关键字结尾的附加属性用于值类型属性,如上面代码中的 barbarSpecified。如果 barSpecified 未设置为“true”,则 bar 属性将不会被序列化。这是 XMLSerializer 表示 bar 为 NULL 且不应序列化的方式。

解决这个问题至少有 3 种可能性:

-删除 barSpecified 属性和字段

-将 barSpecified 设置为“true”

-如果类实现 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);
}
};
}
}

关于c# - XMLSerializer 不序列化类属性,只返回 bool - 'false' *指定成员的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14281556/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com