c# - XmlSerializer द्वारा उत्सर्जित होने से शून्य मान प्रकार को दबाएं




xml-serialization (2)

कृपया निम्नलिखित राशि मान प्रकार की संपत्ति पर विचार करें जिसे एक शून्य के रूप में चिह्नित किया गया है XmlElement:

[XmlElement(IsNullable=true)] 
public double? Amount { get ; set ; }

जब एक शून्य मूल्य प्रकार शून्य पर सेट होता है, तो C # XmlSerializer परिणाम निम्न जैसा दिखता है:

<amount xsi:nil="true" />

इस तत्व को उत्सर्जित करने के बजाय, मैं XmlSerializer को पूरी तरह से तत्व को दबाने के लिए चाहता हूं। क्यूं कर? हम ऑनलाइन भुगतान के लिए Authorize.NET का उपयोग कर रहे हैं और Authorize.NET अनुरोध को अस्वीकार करता है यदि यह शून्य तत्व मौजूद है।

वर्तमान समाधान / वर्कअराउंड राशि मूल्य प्रकार की संपत्ति को क्रमबद्ध नहीं करना है। इसके बजाए हमने एक पूरक संपत्ति बनाई है, SerializableAmount, जो राशि पर आधारित है और इसके बजाय क्रमबद्ध है। चूंकि SerializableAmount प्रकार स्ट्रिंग का है, जो संदर्भ प्रकारों की तरह 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); }
}

बेशक, यह सिर्फ एक कामकाज है। क्या शून्य मूल्य प्रकार तत्वों को उत्सर्जित होने से दबाने का एक क्लीनर तरीका है?


आप इसे आजमा सकते हैं:

xml.Replace("xsi:nil=\"true\"", string.Empty);


जोड़ने का प्रयास करें:

public bool ShouldSerializeAmount() {
   return Amount != null;
}

ढांचे के कुछ हिस्सों द्वारा मान्यता प्राप्त कई पैटर्न हैं। जानकारी के लिए, XmlSerializer भी public bool AmountSpecified {get;set;}

पूरा उदाहरण ( decimal भी स्विचिंग):

using System;
using System.Xml.Serialization;

public class Data {
    public decimal? Amount { get; set; }
    public bool ShouldSerializeAmount() {
        return Amount != null;
    }
    static void Main() {
        Data d = new Data();
        XmlSerializer ser = new XmlSerializer(d.GetType());
        ser.Serialize(Console.Out, d);
        Console.WriteLine();
        Console.WriteLine();
        d.Amount = 123.45M;
        ser.Serialize(Console.Out, d);
    }
}

एमएसडीएन पर * चाहिएससेरियल * पर अधिक जानकारी।





xml-serialization