c# क्रमबद्ध करने के लिए DataContractSerializer का उपयोग करना, लेकिन वापस deserialize नहीं कर सकता




c#-4.0 xml-serialization (4)

अन्य समाधान है:

public static T Deserialize<T>(string rawXml)
{
    using (XmlReader reader = XmlReader.Create(new StringReader(rawXml)))
    {
        DataContractSerializer formatter0 = 
            new DataContractSerializer(typeof(T));
        return (T)formatter0.ReadObject(reader);
    }
}

एक टिप्पणी: कभी-कभी ऐसा होता है कि कच्ची xml में उदाहरण शामिल हैं:

<?xml version="1.0" encoding="utf-16"?>

तो निश्चित रूप से आप UTF8 एन्कोडिंग का उपयोग अन्य उदाहरणों में नहीं कर सकते हैं।

मेरे निम्नलिखित 2 कार्य हैं:

public static string Serialize(object obj)
{
    DataContractSerializer serializer = new DataContractSerializer(obj.GetType());
    MemoryStream memoryStream = new MemoryStream();
    serializer.WriteObject(memoryStream, obj);
    return Encoding.UTF8.GetString(memoryStream.GetBuffer());
}

public static object Deserialize(string xml, Type toType)
{
    MemoryStream memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(xml));
   // memoryStream.Position = 0L;
    XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(memoryStream, Encoding.UTF8, new XmlDictionaryReaderQuotas(), null);
    DataContractSerializer dataContractSerializer = new DataContractSerializer(toType);
    return dataContractSerializer.ReadObject(reader);
}

पहले एक ठीक xml स्ट्रिंग के लिए एक वस्तु serialize लगता है। एक्सएमएल वैध प्रतीत होता है, कोई टूटे हुए टैग नहीं, शुरुआत में या अंत में कोई सफेद रिक्त स्थान, आदि। अब दूसरा फ़ंक्शन ऑब्जेक्ट के लिए मेरे xml स्ट्रिंग को वापस हटाना नहीं चाहता है। अंतिम पंक्ति पर मुझे:

इस प्रकार की वस्तु को निष्क्रिय करने में एक त्रुटि थी [MY OBJECT TYPE HERE]। रूट स्तर पर डेटा अमान्य है। पंक्ति 1, स्थिति 1।

मैं क्या गलत कर रहा हूं? मैंने Deserialize फ़ंक्शन को कुछ बार फिर से लिखने की कोशिश की, और यह हमेशा एक ही तरह की त्रुटि प्रतीत होती है। धन्यवाद!

ओह, और इस तरह मैं 2 कार्यों को बुला रहा हूं:

SomeObject so = new SomeObject();
string temp = SerializationManager.Serialize(so);
so = (SomeObject)SerializationManager.Deserialize(temp, typeof(SomeObject));

यहां बताया गया है कि मैंने इसे हमेशा कैसे किया है:

    public static string Serialize(object obj) {
        using(MemoryStream memoryStream = new MemoryStream())
        using(StreamReader reader = new StreamReader(memoryStream)) {
            DataContractSerializer serializer = new DataContractSerializer(obj.GetType());
            serializer.WriteObject(memoryStream, obj);
            memoryStream.Position = 0;
            return reader.ReadToEnd();
        }
    }

    public static object Deserialize(string xml, Type toType) {
        using(Stream stream = new MemoryStream()) {
            byte[] data = System.Text.Encoding.UTF8.GetBytes(xml);
            stream.Write(data, 0, data.Length);
            stream.Position = 0;
            DataContractSerializer deserializer = new DataContractSerializer(toType);
            return deserializer.ReadObject(stream);
        }
    }

मैंने निम्नलिखित कार्य करना समाप्त कर दिया और यह काम करता है।

public static string Serialize(object obj)
{
    using (MemoryStream memoryStream = new MemoryStream())
    {
        DataContractSerializer serializer = new DataContractSerializer(obj.GetType());
        serializer.WriteObject(memoryStream, obj);
        return Encoding.UTF8.GetString(memoryStream.ToArray());
    }
}

public static object Deserialize(string xml, Type toType)
{
    using (MemoryStream memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(xml)))
    {
        XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(memoryStream, Encoding.UTF8, new XmlDictionaryReaderQuotas(), null);
        DataContractSerializer serializer = new DataContractSerializer(toType);
        return serializer.ReadObject(reader);
    }
}

ऐसा लगता है कि स्ट्रीम करते समय सीरियलाइज़ फ़ंक्शन में मुख्य समस्या थी। गेटबफ़र ()। कॉलिंग स्ट्रीम .oArray () काम करने के लिए प्रकट होता है।


XML Deserialize के लिए यह सबसे अच्छा है

 public static object Deserialize(string xml, Type toType)
    {

        using (MemoryStream memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(xml)))
        {
            System.IO.StreamReader str = new System.IO.StreamReader(memoryStream);
            System.Xml.Serialization.XmlSerializer xSerializer = new System.Xml.Serialization.XmlSerializer(toType);
            return xSerializer.Deserialize(str);
        }

    }




datacontractserializer