当前位置: 首页 > 编程语言 > C#

C#学习教程:.NETXmlSerializer如何使值类型为空?分享

时间:2023-04-10 13:01:03 C#

如何使用.NETXmlSerializer使值类型可为空?假设我有这个对象:[Serializable]publicclassMyClass{publicintAge{get;放;}publicintMyClassB{得到;放;}}[可序列化]publicclassMyClassB{publicintRandomNumber{get;放;}}XmlSerializer将像这样序列化对象:04234如何使此属性可为空?IE:propertyAge小于0时不序列化?我尝试使用Nullable,但它将我的对象序列化为:4234通过阅读MSDN文档,我发现:您不能将IsNullable属性应用于类型为值类型的成员,因为值类型不能包含nullNothingnullptra空引用(在VisualBasic中为Nothing).此外,对于可为null的值类型,您不能将此属性设置为false。当这些类型为nullNothingnullptra空引用(在VisualBasic中为Nothing)时,它们通过将xsi:nil设置为true来序列化。来源:http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlelementattribute.isnullable.aspx我知道值类型不能设置为null。值类型总是设置为某个值。序列化不能根据它的当前值来决定是否序列化它。我尝试了属性,但没有用。我尝试创建一个agecontainer对象并使用属性操纵其序列化,但没有成功。我真正想要的是:当属性Age低于0(零)时为4234。看起来你必须实现自定义序列化。是的,这也是我的意思,但我想摆脱它。在应用程序中,对象要复杂得多,我不想自己处理序列化。我刚刚发现了这一点。XmlSerialier查找XXXSpecified布尔属性以确定是否应包含它。这应该可以解决问题。[可序列化]publicclassMyClass{publicintAge{get;放;}[XmlIgnore]publicboolAgeSpecified{get{returnAge>=0;}}publicintMyClassB{得到;放;}}[可序列化]publicclassMyClassB{publicintRandomNumber{get;放;}}certificate:staticstringSerialize(Tobj){varserializer=newXmlSerializer(typeof(T));varbuilder=newStringBuilder();使用(varwriter=newStringWriter(builder)){serializer.Serialize(writer,obj);返回builder.ToString();}}staticvoidMain(string[]args){varwithoutAge=newMyClass(){Age=-1};varwithAge=newMyClass(){Age=20};序列化(没有年龄);//=0序列化(withAge);//=200}编辑:是的,这是一个文档化的功能。请参阅XmlSerializer的MSDN条目另一种选择是使用特殊模式创建XmlSerializer可识别的布尔字段,并将XmlIgnoreAttribute应用于该字段。架构以propertyNameSpecified的形式创建。例如,如果您有一个名为“MyFirstName”的字段,您还将创建一个名为“MyFirstNameSpecified”的字段,它告诉XmlSerializer是否生成一个名为“MyFirstName”的XML元素。将Samuel的回答和GregBeech的评论扩展到布尔属性的情况:如果属性是bool类型,那么您不能在propertySpecified属性中编写简单的测试。解决方案是使用Nullable类型,那么propertySpecified属性中的测试就是property.HasValue。例如使用System.Xml.Serialization;公共类人{公共布尔?就业{得到;放;}[XmlIgnore]publicboolEmployedSpecified{get{returnEmployed.HasValue;suggested)是将value属性设置为一个无效的默认值,比如-1,像这样:usingSystem.ComponentModel;使用System.Xml.Serialization;publicclassPerson{[DefaultValue(-1)]publicintAge{get;放;}[XmlIgnore]publicboolAgeSpecified{get{returnAge>=0;您可以使用XmlElementAttribute.IsNullable:[Serializable]publicclassMyClass{[XmlElement(IsNullable=true)]publicint?年龄{得到;放;}publicintMyClassB{得到;放;这应该有助于MakeAgeint?和..publicboolShouldSerializeAge(){returnAge.HasValue;..确实意味着将ShouldSerializeXXX方法添加到您的类中!忘记Nullable...ShouldSerializeXXX是一个非常好的解决方案。这里的年龄会根据你的情况进行连载。[可序列化]publicclassMyClass{publicintAge{get;放;}publicintMyClassB{得到;放;}#region条件序列化publicboolShouldSerializeAge(){returnage>0;}#endregion}[Serializable]publicclassMyClassB{publicintRandomNumber{get;放;如果您将某个元素的'minoccurs'属性设置为'minoccurs="0"',xsd.exe将自动生成XXXSpecified属性和访问器...如果您使用模式定义xml/class以上是C#学习教程:如何使用.NETXmlSerializer使值类型为空?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: