2009-08-18 12 views
61
द्वारा उत्सर्जित होने

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

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

एक नल मान प्रकार अशक्त करने के लिए सेट किया जाता है, सी # 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); } 
} 

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

+5

btw; "राशि" (भुगतान के लिए) 'दशमलव' के रूप में बेहतर हो सकती है। –

+1

अच्छा बिंदु: फ़्लोटिंग पॉइंट पैसा बुरा है। –

+0

@Marc इसे भी कॉल करने के लिए धन्यवाद। –

उत्तर

130

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

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

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

पूर्ण उदाहरण (भी decimal का उपयोग करने जा): ShouldSerialize* on MSDN पर

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); 
    } 
} 

में अधिक जानकारी।

+3

हाय मार्क, यही कारण है कि मुझे एसओ पसंद है ... आप इस तरह कुछ सीखते हैं। हालांकि मेरे पास कुछ प्रश्न हैं। मैं केवल इस सुविधा के निम्नलिखित दस्तावेज msdn में प्राप्त कर सकता हूं: http://msdn.microsoft.com/en-us/library/53b8022e.aspx क्या आप किसी भी * वास्तविक * दस्तावेज़ के बारे में जानते हैं? इसके अलावा, चूंकि यह सुविधा बहुत खराब दस्तावेज है, इसलिए मैं इसका उपयोग करके थोड़ा गंदा महसूस करूंगा। क्या यह इस तरह की एक प्रतीत होता है अनियंत्रित सुविधा का उपयोग करने के लिए "सुरक्षित" है? – JohannesH

+5

वाह, यही वह है जिसे मैं गहराई से अस्पष्ट कहूंगा। अच्छा है कि आपको यह मिला, हालांकि। –

+0

धन्यवाद मार्क। अब जब आपने मुझे बताया कि क्या देखना है, मुझे लगता है कि मुझे XmlSerializer "संपत्ति + निर्दिष्ट" पैटर्न पर एमएसडीएन संदर्भ मिला। यहां यह है: http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx। यदि आप मुझसे पूछें तो सही एमएसडीएन संदर्भ पृष्ठ खोजने के बाद भी यह खोजना मुश्किल है। :) एक बार फिर धन्यवाद। –

6

वहाँ भी

[XmlElement("amount", IsNullable = false)] 
public string SerializableAmount 
{ 
    get { return this.Amount == null ? "" : this.Amount.ToString(); } 
    set { this.Amount = Convert.ToDouble(value); } 
} 
0

पाने के लिए

<amount /> instead of <amount xsi:nil="true" /> 

उपयोग आप इस कोशिश कर सकते हैं एक विकल्प है:

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

संबंधित मुद्दे