使用XmlSerializer序列化第三方Web引用对象时部分属性丢失
使用XmlSerializer序列化第三方提供的Web引用对象时,对象所有属性均已正确赋值,但序列化后部分属性丢失。
代码片段:
MerchantWSBO merchantWSBO = BuildMerchantObject(merchantInsertRow);//从数据库构建对象 string xmlToSend = ClassToXML(merchantWSBO );//merchantWSBO为第三方提供的远程对象
执行后,xmlToSend字符串中缺少所需属性,相关对象结构如下:
MerchantWSBO包含私有属性MerchantWSVO类型的overviewField,通过带[System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]特性的公共属性overview访问。MerchantWSVO中缺失的属性discoverRetained定义:/// <remarks/> [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public System.Nullable<bool> discoverRetained { get { return this.discoverRetainedField; } set { this.discoverRetainedField = value; } }
在BuildMerchantObject方法中已为该属性赋值为数据库获取的true,但序列化后该属性缺失。而同为MerchantWSVO的string类型属性binBlockingIndicatorField可正常序列化,请问问题原因是什么?
第三方生成代码的
ShouldSerialize方法逻辑错误:Web引用生成的代码通常会自动为Nullable类型属性生成ShouldSerializeXXX()方法,用于控制是否序列化该属性。如果MerchantWSVO类中存在ShouldSerializediscoverRetained()方法,且其返回逻辑错误(比如错误判断为仅当值为false时才序列化),就会导致赋值true时该属性被跳过。属性赋值未实际生效:虽然你认为在
BuildMerchantObject中已赋值为true,但可能存在赋值路径错误——比如误给其他字段赋值,或者overview属性的实例未正确初始化(不过同类型的string属性能正常序列化,说明overview实例是有效的,这条可能性较低)。XML序列化特性冲突:第三方生成的
MerchantWSVO类可能存在隐式的[XmlIgnore]标记,或者XmlElementAttribute的Namespace与序列化时的默认命名空间不匹配,导致该属性被序列化器忽略。
检查
ShouldSerialize方法:查看MerchantWSVO类的完整代码,确认是否存在ShouldSerializediscoverRetained()方法。如果有,修正其返回逻辑,确保当discoverRetained有值(包括true)时返回true:public bool ShouldSerializediscoverRetained() { return this.discoverRetainedField.HasValue; // 只要有值就序列化 }验证属性实际值:在序列化前添加调试代码,确认
discoverRetained的实际值是否为true,排除赋值未生效的问题:Console.WriteLine(merchantWSBO.overview.discoverRetained); // 确认输出为True强制序列化属性:如果无法修改第三方代码,可通过继承
MerchantWSVO并重写属性,或者手动添加ShouldSerialize方法(若允许修改),强制序列化该属性:public bool ShouldSerializediscoverRetained() { return true; // 无论值是什么都序列化 }
内容的提问来源于stack exchange,提问作者gene

