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.ToDecimal
从 ToString
使用的精度。
我们正在连接到一个提供 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.ToDecimal
从 ToString
使用的精度。