WCF 将十进制序列化为具有 2 位小数精度的字符串

WCF serialization of decimal to string with 2 decimal precision

我们正在连接到一个提供 WSDL 的外部系统,该 WSDL 要求提供小数点后 2 位小数 - 即:

<collectionAmount>1000.00</collectionAmount>

但是,当我们的客户端序列化 SOAP 请求时,小数点以单一精度显示:

<collectionAmount>1000.0</collectionAmount>

我们尝试使用元数据扩展:

    [MetadataType(typeof(amountSetRequestMetadata))]
    public partial class amountSetRequest
    {
        internal sealed class amountSetRequestMetadata
        {
            [XmlIgnore]
            public decimal collectionAmount { get; set; }

            [System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified, Order = 14, ElementName = "collectionAmount")]
            public string collectionAmountString => "yay!";
        }
    }

amountSetRequest 是 WSDL 服务自动生成器生成的部分 class。输出 XML 没有什么不同,因此这似乎对请求没有任何影响。

我们认为这很常见,但无法找到解决方法。我们已经看到扩展基础 XML 序列化程序的解决方案。

以这种方式序列化 SOAP 请求的最干净的方法是什么?

使用以下内容:

    public partial class amountSetRequest
    {
        private decimal _collectionAmount { get; set; }

        public string collectionAmount {
            get {return _collectionAmount.ToString("F2");}
            set {_collectionAmount = decimal.Parse(value);}
        }
    }

所以我们通过稍微破解类型系统来修复它。

事实证明,小数从字符串转换回小数有不同的精度。因此我们做了:

public void RequestAmount(decimal amount) {
   var request = new amountSetRequest()
   request.collectionAmount = Convert.ToDecimal(amount.ToString("F2"));
   // ...
}

在 XML 序列化程序看到小数点时执行此操作时,它会保持 Convert.ToDecimalToString 使用的精度。