Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 禁止XmlSerializer发出空值类型 请考虑下面的金额值类型属性,该属性被标记为可空XMLNET: < /P> [XmlElement(IsNullable=true)] public double? Amount { get ; set ; }_C#_Xml_Xml Serialization - Fatal编程技术网

C# 禁止XmlSerializer发出空值类型 请考虑下面的金额值类型属性,该属性被标记为可空XMLNET: < /P> [XmlElement(IsNullable=true)] public double? Amount { get ; set ; }

C# 禁止XmlSerializer发出空值类型 请考虑下面的金额值类型属性,该属性被标记为可空XMLNET: < /P> [XmlElement(IsNullable=true)] public double? Amount { get ; set ; },c#,xml,xml-serialization,C#,Xml,Xml Serialization,当可为null的值类型设置为null时,C#XmlSerializer结果如下所示: <amount xsi:nil="true" /> 我希望XmlSerializer完全抑制该元素,而不是发出该元素。为什么?我们正在使用Authorize.NET进行在线支付,如果存在此空元素,Authorize.NET将拒绝请求 当前的解决方案/解决方法是根本不序列化Amount value类型属性。相反,我们创建了一个互补属性SerializableMount,它基于Amount并被序列

当可为null的值类型设置为null时,C#XmlSerializer结果如下所示:

<amount xsi:nil="true" />

我希望XmlSerializer完全抑制该元素,而不是发出该元素。为什么?我们正在使用Authorize.NET进行在线支付,如果存在此空元素,Authorize.NET将拒绝请求

当前的解决方案/解决方法是根本不序列化Amount value类型属性。相反,我们创建了一个互补属性SerializableMount,它基于Amount并被序列化。由于SerializableMount是String类型,与引用类型类似,如果默认为null,则XmlSerializer会抑制这些类型,因此一切都很正常

/// <summary>
/// Gets or sets the amount.
/// </summary>
[XmlIgnore]
public double? Amount { get; set; }

/// <summary>
/// Gets or sets the amount for serialization purposes only.
/// This had to be done because setting value types to null 
/// does not prevent them from being included when a class 
/// is being serialized.  When a nullable value type is set 
/// to null, such as with the Amount property, the result 
/// looks like: &gt;amount xsi:nil="true" /&lt; which will 
/// cause the Authorize.NET to reject the request.  Strings 
/// when set to null will be removed as they are a 
/// reference type.
/// </summary>
[XmlElement("amount", IsNullable = false)]
public string SerializableAmount
{
    get { return this.Amount == null ? null : this.Amount.ToString(); }
    set { this.Amount = Convert.ToDouble(value); }
}
//
///获取或设置金额。
/// 
[XmlIgnore]
公共双人房?金额{get;set;}
/// 
///获取或设置仅用于序列化目的的金额。
///必须这样做,因为将值类型设置为null
///不阻止在创建类时包含它们
///正在序列化。当设置了可为空的值类型时
///若要为null,例如使用Amount属性,则结果
///看起来像:amount xsi:nil=“true”/
///导致Authorize.NET拒绝该请求。串
///当设置为null时,将被删除,因为它们是
///引用类型。
/// 
[XmlElement(“金额”,IsNullable=false)]
公共字符串序列化装载
{
get{返回this.Amount==null?null:this.Amount.ToString();}
设置{this.Amount=Convert.ToDouble(value);}
}
当然,这只是一个解决办法。是否有更干净的方法来禁止发出空值类型元素?

尝试添加:

public bool ShouldSerializeAmount() {
   return Amount != null;
}
框架的某些部分可以识别许多模式。对于信息,
XmlSerializer
还查找指定的
public bool数量{get;set;}

完整示例(也切换到十进制):


有关的详细信息。

还有一种替代方法可供选择

 <amount /> instead of <amount xsi:nil="true" />
您可以尝试以下方法:


xml.Replace(“xsi:nil=\“true\”,string.Empty)

顺便说一句;“金额”(用于支付)可能比十进制更好。
decimal
。好的一点:浮点货币是邪恶的。@Marc谢谢你也这么说。你的解决方案很好,我也使用它。不过马克的答案更好…嗨,马克,这就是为什么我如此爱你。。。你会学到这样的东西。不过我有几个问题。我只能在msdn中找到此功能的以下文档:您知道任何真实的文档吗?此外,由于该功能的文档记录非常糟糕,因此使用它时我会感到有点脏。使用这样一个看似没有文档记录的功能是否“安全”呢?哇,这就是我所说的深奥。很酷,你找到了,谢谢,马克。既然您告诉我要查找什么,我想我在XmlSerializer“property+specified”模式上找到了MSDN引用。这是:。如果你问我,找到正确的MSDN参考页后,甚至很难找到。:)再次感谢。嗯。。。我已经看过了,我找不到更正式的。。。仍在寻找。以下是ShouldSerialize模式的MSDN参考:
 <amount /> instead of <amount xsi:nil="true" />
[XmlElement("amount", IsNullable = false)]
public string SerializableAmount
{
    get { return this.Amount == null ? "" : this.Amount.ToString(); }
    set { this.Amount = Convert.ToDouble(value); }
}