You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#对象转XML时布尔值未序列化的问题求助

解决XmlSerializer不序列化布尔属性的问题

你遇到的这个情况是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:46:38