c# - अगर रिटर्न प्रकार एक त्रुटि या सफलता वस्तु हो सकती है तो एक्सएमएल को डिसेर्बलाइज कैसे करें



xml serialization (1)

मैं एक XML आधारित एपीआई के साथ काम कर रहा हूं कि इसकी रूट नोड के रूप में या तो एक SuccessResponse या एक ErrorResponse वापस कर सकते हैं।

मैं डेटा का उपयोग करने के लिए नीचे का उपयोग कर रहा हूं, लेकिन मुझे यकीन नहीं है कि कैसे रिटर्न के मामले को SuccessResponse नहीं किया जा SuccessResponse । उस स्थिति को संभालने का सबसे अच्छा तरीका क्या है जहां लौटा एक्सएमएल अपेक्षित प्रारूप में नहीं है?

मुझे पता है कि मैं एक हैक तरीका कर सकता था और SuccessResponse या ErrorResponse की घटना को देख सकता था लेकिन यह सही नहीं लगता।

    TheIconicApiResult result = this.apiService.SendGetRequest("GetProducts", new List<AbstractParam>() { new FilterParam("live"), new LimitParam(5000) });
    IXmlSerialiser xmlSerialiser = new XmlSerialiser();
    var xmlBody = xmlSerialiser.ParseXML<SuccessResponse>(result.ResponseBody);

    public TObject ParseXML<TObject>(string xml)
    {
        using (TextReader reader = new StreamReader(GetMemoryStream(xml)))
        {
            XmlSerializer serialiser = new XmlSerializer(typeof(TObject));
            return (TObject)serialiser.Deserialize(reader);
        }
    }

उन स्थितियों में जहां आपके पास XML स्ट्रीम कई संभावित दस्तावेज़ प्रकारों में से एक है, आप प्रत्येक प्रकार के लिए एक XmlSerializer निर्माण कर सकते हैं और XmlSerializer.CanDeserialize(XmlReader) को सफलतापूर्वक परीक्षण करने के लिए कॉल XmlSerializer.CanDeserialize(XmlReader) सकते हैं कि क्या दस्तावेज़ उस प्रकार में deserialized हो सकता है। यह विधि रूट तत्व से पहले XmlReader आगे नहीं XmlReader इसलिए इसे स्ट्रीम को फिर से पढ़े बिना कई बार कहा जा सकता है।

उदाहरण के लिए, आप निम्नलिखित विस्तार विधि का परिचय दे सकते हैं:

public static partial class XmlSerializerExtensions
{
    public static object DeserializePolymorphicXml(this string xml, params Type[] types)
    {
        using (var textReader = new StringReader(xml))
        {
            return textReader.DeserializePolymorphicXml(types);
        }
    }

    public static object DeserializePolymorphicXml(this TextReader textReader, params Type[] types)
    {
        if (textReader == null || types == null)
            throw new ArgumentNullException();
        var settings = new XmlReaderSettings { CloseInput = false }; // Let caller close the input.
        using (var xmlReader = XmlReader.Create(textReader, settings))
        {
            foreach (var type in types)
            {
                var serializer = new XmlSerializer(type);
                if (serializer.CanDeserialize(xmlReader))
                    return serializer.Deserialize(xmlReader);
            }
        }
        throw new XmlException("Invalid root type.");
    }
}

फिर इसे निम्नानुसार उपयोग करें:

var xmlBody = result.ResponseBody.DeserializePolymorphicXml(typeof(SuccessResponse), typeof(FailResponse));
if (xmlBody is SuccessResponse)
{
    // Handle successful response
}
else if (xmlBody is FailResponse)
{
    // Handle failed response
}
else
{
    // unknown response
    throw new InvalidOperationException("unknown response");
}

नमूना fiddle





serialization