C#对象转XML时布尔值未序列化的问题求助
你遇到的这个情况是XmlSerializer的一个典型默认行为——当你的类里定义了xxxSpecified格式的配套字段时,XmlSerializer会以此作为开关:只有当xxxSpecified的值为true时,才会序列化对应的xxx属性。
你的acceptManualApproval和acceptPartial被设为false,但对应的acceptManualApprovalSpecified和acceptPartialSpecified默认值是false,所以这两个布尔属性就被XmlSerializer跳过了,没有出现在XML输出里。
下面给你两种可行的解决办法:
方法1:手动开启Specified开关
在实例化LocateRequest的时候,把对应的Specified字段设为true,不管布尔属性本身是true还是false,这样就能强制XmlSerializer序列化它。修改你的实例化代码如下:
LocateRequest stockLoanRequest = new LocateRequest(); stockLoanRequest.acceptManualApproval = false; stockLoanRequest.acceptManualApprovalSpecified = true; // 强制序列化该属性 stockLoanRequest.acceptPartial = false; stockLoanRequest.acceptPartialSpecified = true; // 强制序列化该属性 stockLoanRequest.market = "US"; stockLoanRequest.cashOrSwap = cashOrSwapType.CASH; stockLoanRequest.requestedQuantity = request.shares.ToString(); stockLoanRequest.requestorReference = request.locateId; stockLoanRequest.securityId = request.symbol; stockLoanRequest.securityIdentifierType = securityIdentifierType.TICKER; return stockLoanRequest;
修改后你的XML输出就会包含这两个布尔属性了,类似这样:
<LocateRequest securityId="IBM" securityIdentifierType="TICKER" market="US" requestedQuantity="1" requestorReference="34" acceptManualApproval="false" acceptPartial="false" />
方法2:调整类定义,移除Specified机制
如果你希望所有布尔属性无论值是什么都默认被序列化,可以直接移除对应的xxxSpecified字段和[XmlIgnore]特性;或者给布尔属性添加[DefaultValue]特性,告诉XmlSerializer即使值是默认值也要保留它。
比如修改acceptManualApproval的属性定义:
/// <remarks/> [System.Xml.Serialization.XmlAttributeAttribute()] [System.ComponentModel.DefaultValue(false)] // 指定默认值,强制序列化 public bool acceptManualApproval { get { return this.acceptManualApprovalField; } set { this.acceptManualApprovalField = value; } } // 同时可以删除对应的acceptManualApprovalSpecified字段和属性
这种xxxSpecified的模式一般是工具(比如xsd.exe)自动生成的,用来处理可选属性——当你不想序列化默认值时可以用它来跳过。但如果你的需求是必须序列化所有布尔属性,上面两种方法都能解决问题。
内容的提问来源于stack exchange,提问作者Prashant Naik

