কোনও বস্তুকে XML স্ট্রিংয়ে রূপান্তর করুন


92

আমি WebserviceTypeএক্সএসডি ফাইল থেকে xsd.exe সরঞ্জামটি পেয়েছিলাম নামের একটি ক্লাস পেয়েছি।

এখন আমি WebServiceTypeকোনও স্ট্রিংয়ের জন্য কোনও অবজেক্টের উদাহরণটি ডিজাইরাইজ করতে চাই । কিভাবে আমি এটি করতে পারব?

MethodCheckTypeবস্তুর একটি প্যারাম যেমন হয়েছে WebServiceTypeঅ্যারে।

আমার প্রথম চেষ্টাটি এটির মতো সিরিয়াল করার মতো ছিল: একটি XmlSerializerএবং একটি দিয়ে StringWriter(সিরিয়ালাইজ করার সময় আমি একটি ব্যবহার করেছি StringReader)।

এটি সেই পদ্ধতিতে আমি WebServiceTypeঅবজেক্টটিকে সিরিয়ালাইজ করি :

XmlSerializer serializer = new XmlSerializer(typeof(MethodCheckType));
        MethodCheckType output = null;
        StringReader reader = null;

        // catch global exception, logg it and throw it
        try
        {
            reader = new StringReader(path);
            output = (MethodCheckType)serializer.Deserialize(reader);
        }
        catch (Exception)
        {
            throw;
        }
        finally
        {
            reader.Dispose();
        }

        return output.WebService;

সম্পাদনা করুন:

হয়তো আমি এটি বিভিন্ন কথায় বলতে পারি: আমি এই MethodCheckTypeবস্তুর একটি উদাহরণ পেয়েছি অন্যদিকে আমি এক্সএমএল ডকুমেন্ট পেয়েছি যা থেকে আমি এই অবজেক্টটি সিরিয়ালযুক্ত করেছি। এখন আমি একটি স্ট্রিং আকারে এই উদাহরণটি একটি এক্সএমএল ডকুমেন্টে রূপান্তর করতে চাই। এর পরে আমাকে প্রমাণ করতে হবে যদি উভয় স্ট্রিং (এক্সএমএল নথিগুলির) একই হয় are এটি আমার করতে হবে, কারণ আমি প্রথম পদ্ধতির ইউনিট টেস্ট তৈরি করি যেখানে আমি কোনও এক্সএমএল ডকুমেন্টকে StringReaderএকটিতে পড়ে এবং এটি কোনও MethodCheckTypeবস্তুতে সিরিয়ালাইজ করি ।


4
আপনি কি ত্রুটি পেতে পারি? এবং আপনি শর্তগুলি বিভ্রান্ত করতে পারেন: সিরিয়ালাইজেশন (এক্সএমএল বিশ্বে) কোনও বস্তু থেকে এক্সএমএলে রূপান্তর করছে ; ডিসরিয়ালাইজেশন এক্সএমএল থেকে কোনও বস্তুতে রূপান্তরিত হচ্ছে । আপনি কি কোনও এক্সএমএল স্ট্রিং থেকে কোনও অবজেক্টকে ডিসরিয়ালাইজ করতে চান ?
কার্লোসফিগুইরা

উত্তর:


195

এখানে উভয় উপায়ে রূপান্তর পদ্ধতি। এটি = আপনার শ্রেণীর উদাহরণ

public string ToXML()
    {
        using(var stringwriter = new System.IO.StringWriter())
        { 
            var serializer = new XmlSerializer(this.GetType());
            serializer.Serialize(stringwriter, this);
            return stringwriter.ToString();
        }
    }

 public static YourClass LoadFromXMLString(string xmlText)
    {
        using(var stringReader = new System.IO.StringReader(xmlText))
        {
            var serializer = new XmlSerializer(typeof(YourClass ));
            return serializer.Deserialize(stringReader) as YourClass ;
        }
    }

14
সঠিক উত্স প্রকাশের জন্য usingআপনার প্যাটার্ন বা কল Disposeপদ্ধতি ব্যবহার করা উচিত ।
ইভান কোচুরকিন

নিয়ন্ত্রণহীন কোড ব্যবহার না করা ছাড়া আপনার অবশ্যই সমস্ত সিএলআর সংস্করণ নিশ্চিত হওয়া উচিত।
AlphaOmega

4
কেন? কারণ আপনার উচিত রিসোর্স নিবিড় ( নিয়ন্ত্রণহীন এবং পরিচালিত ) সমস্ত কিছু নিষ্পত্তি করা উচিত । কেবল আবর্জনা সংগ্রহকারী আপনার জন্য পরিষ্কার করবে (শেষ পর্যন্ত) এর অর্থ এই নয় যে আপনার কাজটি নিরঙ্কুশভাবে কঠিন করা উচিত। আপনি পাশাপাশি যাওয়ার সাথে সাথে পরিষ্কার করুন এবং আপনার কোডটি আরও কার্যকর হবে। কেন স্পষ্টত নিষ্পত্তি করা যায় সে সম্পর্কে আরও তথ্য এখানে একটি ভাল ধারণা
লিয়াম

4
কেবল স্বচ্ছতার জন্য আপনাকে বলছি StringWriter এবং StringReader ত্যাগী (XmlSerializer একটি নিষ্পত্তি পদ্ধতি নেই হিসাবে) সম্পর্কে কথা বলা হয়
symbiont

ফাংশনটির রিলিজ রিসোর্সের সমাপ্তি ঠিক তত দক্ষতার সাথে নয় using? @ কাভানটিটিটি?
মার্ক এ্যানিংথ

79

আমি বুঝতে পারি এটি একটি অতি পুরানো পোস্ট, তবে এলবির প্রতিক্রিয়া দেখার পরে আমি কীভাবে গ্রহণযোগ্য উত্তরের উপর উন্নতি করতে এবং এটি নিজের আবেদনের জন্য জেনেরিক করতে পারি তা ভেবেছিলাম। আমি এখানে যা এলাম তা এখানে:

public static string Serialize<T>(T dataToSerialize)
{
    try
    {
        var stringwriter = new System.IO.StringWriter();
        var serializer = new XmlSerializer(typeof(T));
        serializer.Serialize(stringwriter, dataToSerialize);
        return stringwriter.ToString();
    }
    catch
    {
        throw;
    }
}

public static T Deserialize<T>(string xmlText)
{
    try
    {
        var stringReader = new System.IO.StringReader(xmlText);
        var serializer = new XmlSerializer(typeof(T));
        return (T)serializer.Deserialize(stringReader);
    }
    catch
    {
        throw;
    }
}

এই পদ্ধতিগুলি এখন একটি স্ট্যাটিক সহায়ক শ্রেণিতে স্থাপন করা যেতে পারে যার অর্থ প্রতিটি শ্রেণীর কোনও কোড নকল যাতে ক্রমিকরূপীকরণ করা দরকার।


10
"সিরিয়ালাইজ" পদ্ধতিতে টাইপফোর (টি) এর পরিবর্তে ডেটাটোসরিয়ালাইজ.গেটটাইপ () ব্যবহার করুন। প্রথম নজরে এটি টাইপ হিসাবে টি ব্যবহার করা নিরাপদ বলে মনে হয় তবে "ডেটাটোসরিজাল" বস্তুটি যদি কোনও প্যারেন্ট টাইপের (বেইডক্লাসে চাইল্ডক্লাসে )ালাই) কাস্ট করা থাকে তবে এটি ত্রুটি ছুঁড়ে দেবে। এবং অবশ্যই নাল জন্য অবশ্যই এটি পরীক্ষা করে দেখুন।
পল ইস্টার

4
অন্য কিছু না করে কেবল পুনর্নবীকরণের বিষয়টি কী?
20-10

দুর্দান্ত প্রশ্ন; আমি এখানে কার্যকারিতার জন্য কাঠামোর একটি সম্পূর্ণ চিত্র বিকাশের চেষ্টা করছিলাম না, এবং আমি অবশ্যই ব্যতিক্রমটিকে গ্রাস করে এমন একটি উদাহরণ দিতে চাইনি। একসময় ভাল, জেনেরিক বিকল্প হিসাবে মনে হয়েছিল। উন্নতি প্রস্তাব নির্দ্বিধায়!
উইলিয়াম স্মিথ

ভাল পুনঃব্যবহারযোগ্য সমাধান।
নীতেশ সাক্সেনা

21
    public static string Serialize(object dataToSerialize)
    {
        if(dataToSerialize==null) return null;

        using (StringWriter stringwriter = new System.IO.StringWriter())
        {
            var serializer = new XmlSerializer(dataToSerialize.GetType());
            serializer.Serialize(stringwriter, dataToSerialize);
            return stringwriter.ToString();
        }
    }

    public static T Deserialize<T>(string xmlText)
    {
        if(String.IsNullOrWhiteSpace(xmlText)) return default(T);

        using (StringReader stringReader = new System.IO.StringReader(xmlText))
        {
            var serializer = new XmlSerializer(typeof(T));
            return (T)serializer.Deserialize(stringReader);
        }
    }

4
সিরিয়ালাইজের জন্য জেনেরিকের দরকার নেই। অবজেক্ট যথেষ্ট। যদি (ডেটাটোশিরিজ == নাল) নাল ফেরান; ... var সিরিয়ালাইজার = নতুন এক্সএমএলসিরাইজার (ডেটাটোসরিয়ালাইজ.গেটটাইপ ()); ...
আলফাওমেগা

0

এটি আমার সমাধান, যে কোনও তালিকার অবজেক্টের জন্য আপনি এই কোডটি এক্সএমএল লেআউটে রূপান্তর করতে ব্যবহার করতে পারেন। কীফাদার হ'ল আপনার মূল ট্যাগ এবং কীসনই আপনার ফোরচ শুরু করে।

public string BuildXml<T>(ICollection<T> anyObject, string keyFather, string keySon)
    {
        var settings = new XmlWriterSettings
        {
            Indent = true
        };
        PropertyDescriptorCollection props = TypeDescriptor.GetProperties(typeof(T));
        StringBuilder builder = new StringBuilder();
        using (XmlWriter writer = XmlWriter.Create(builder, settings))
        {
            writer.WriteStartDocument();
            writer.WriteStartElement(keyFather);
            foreach (var objeto in anyObject)
            {
                writer.WriteStartElement(keySon);
                foreach (PropertyDescriptor item in props)
                {
                    writer.WriteStartElement(item.DisplayName);
                    writer.WriteString(props[item.DisplayName].GetValue(objeto).ToString());
                    writer.WriteEndElement();
                }
                writer.WriteEndElement();
            }
            writer.WriteFullEndElement();
            writer.WriteEndDocument();
            writer.Flush();
            return builder.ToString();
        }
    }

0
 public static class XMLHelper
    {
        /// <summary>
        /// Usage: var xmlString = XMLHelper.Serialize<MyObject>(value);
        /// </summary>
        /// <typeparam name="T">Kiểu dữ liệu</typeparam>
        /// <param name="value">giá trị</param>
        /// <param name="omitXmlDeclaration">bỏ qua declare</param>
        /// <param name="removeEncodingDeclaration">xóa encode declare</param>
        /// <returns>xml string</returns>
        public static string Serialize<T>(T value, bool omitXmlDeclaration = false, bool omitEncodingDeclaration = true)
        {
            if (value == null)
            {
                return string.Empty;
            }
            try
            {
                var xmlWriterSettings = new XmlWriterSettings
                {
                    Indent = true,
                    OmitXmlDeclaration = omitXmlDeclaration, //true: remove <?xml version="1.0" encoding="utf-8"?>
                    Encoding = Encoding.UTF8,
                    NewLineChars = "", // remove \r\n
                };

                var xmlserializer = new XmlSerializer(typeof(T));

                using (var memoryStream = new MemoryStream())
                {
                    using (var xmlWriter = XmlWriter.Create(memoryStream, xmlWriterSettings))
                    {
                        xmlserializer.Serialize(xmlWriter, value);
                        //return stringWriter.ToString();
                    }

                    memoryStream.Position = 0;
                    using (var sr = new StreamReader(memoryStream))
                    {
                        var pureResult = sr.ReadToEnd();
                        var resultAfterOmitEncoding = ReplaceFirst(pureResult, " encoding=\"utf-8\"", "");
                        if (omitEncodingDeclaration)
                            return resultAfterOmitEncoding;
                        return pureResult;
                    }
                }
            }
            catch (Exception ex)
            {
                throw new Exception("XMLSerialize error: ", ex);
            }
        }

        private static string ReplaceFirst(string text, string search, string replace)
        {
            int pos = text.IndexOf(search);

            if (pos < 0)
            {
                return text;
            }

            return text.Substring(0, pos) + replace + text.Substring(pos + search.Length);
        }
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.