दिलचस्प पोस्ट
रेल 3 – link_to काम नहीं करने के लिए नष्ट करने के लिए पिछला बटन दबाए जाने पर मैं एक गतिविधि को कैसे मारूं? कोई भी अच्छा, दृश्य HTML5 संपादक या आईडीई? त्रुटि आईटीएमएस -9000: "रिडंडंट बाइनरी अपलोड। ट्रेन '1.0' के लिए बिल्ड वर्जन '1.0' के साथ एक बाइनरी अपलोड पहले से मौजूद है " मणि स्थापित करना या रूबी गेम्स को अपडेट करने में अनुमति त्रुटि के साथ विफल रहता है एक सूची के सभी संभावित क्रमपरिवर्तन उत्पन्न करना सी / सी ++ में गणित अभिव्यक्ति पार्स करना अजगर कार्यों में रिटर्न वैल्यू के रूप में सही, गलत और कोई नहीं का उपयोग करें एएसपी.नेट वेब एपीआई सत्र या कुछ और? एक्स और वाई निर्देशांक के numpy arrays में निकटतम बिंदु का सूचक ढूँढना PHP कोड के भीतर से एक MySQL संग्रहीत प्रक्रिया को कैसे कॉल करें? बैच की फाइलें: एक फाइल कैसे पढ़ सकती है? कैसे घटना वस्तु को तार करने के लिए? एंड्रॉइड – एक प्रगति बर्र को क्षैतिज के बजाय एक लंबवत पट्टी बनाने के लिए सेट करें? सीकेके में सी ++ 11 सक्रिय कैसे करें?

एक ऑब्जेक्ट को यूटीएफ -8 एक्सएमएल के रूप में एनएएल में serializing

संक्षेप के लिए उचित ऑब्जेक्ट निपटान हटाया गया लेकिन मुझे आश्चर्य है कि अगर यह स्मृति में यूटीएफ -8 के रूप में किसी वस्तु को एन्कोड करने का सबसे आसान तरीका है। वहाँ एक आसान तरीका है वहाँ नहीं है?

var serializer = new XmlSerializer(typeof(SomeSerializableObject)); var memoryStream = new MemoryStream(); var streamWriter = new StreamWriter(memoryStream, System.Text.Encoding.UTF8); serializer.Serialize(streamWriter, entry); memoryStream.Seek(0, SeekOrigin.Begin); var streamReader = new StreamReader(memoryStream, System.Text.Encoding.UTF8); var utf8EncodedXml = streamReader.ReadToEnd(); 

Solutions Collecting From Web of "एक ऑब्जेक्ट को यूटीएफ -8 एक्सएमएल के रूप में एनएएल में serializing"

आपका कोड यूटीएफ -8 को स्मृति में नहीं मिल रहा है जैसा कि आप उसे फिर से स्ट्रिंग में पढ़ते हैं, इसलिए इसे अब यूटीएफ -8 में नहीं, बल्कि यूटीएफ -16 में वापस (हालांकि आदर्श रूप से सबसे बेहतर स्ट्रिंग्स की तुलना में उच्च स्तर पर विचार करने के लिए किसी भी एन्कोडिंग, को छोड़कर जब ऐसा करने के लिए मजबूर)

वास्तविक यूटीएफ -8 ऑक्टेट प्राप्त करने के लिए जो आप उपयोग कर सकते हैं:

 var serializer = new XmlSerializer(typeof(SomeSerializableObject)); var memoryStream = new MemoryStream(); var streamWriter = new StreamWriter(memoryStream, System.Text.Encoding.UTF8); serializer.Serialize(streamWriter, entry); byte[] utf8EncodedXml = memoryStream.ToArray(); 

मैंने छोड़ दिया है उसी निपटान को छोड़ दिया है मैं निम्न पक्षों का पक्षधर हूं (सामान्य निपटान में छोड़ दिया गया है):

 var serializer = new XmlSerializer(typeof(SomeSerializableObject)); using(var memStm = new MemoryStream()) using(var xw = XmlWriter.Create(memStm)) { serializer.Serialize(xw, entry); var utf8 = memStm.ToArray(); } 

जो बहुत ही जटिलता का एक समान राशि है, लेकिन यह दर्शाता है कि प्रत्येक चरण में कुछ और करने के लिए एक उचित विकल्प है, जिसमें सबसे अधिक दबाव है स्मृति के अलावा कहीं और क्रमबद्ध करने के लिए, जैसे फाइल के लिए, टीसीपी / आईपी धारा, डेटाबेस, आदि। सब कुछ, यह वाकबोज़ वास्तव में नहीं है

नहीं, आप मध्यवर्ती StringWriter से छुटकारा पाने के लिए StringWriter का उपयोग कर सकते हैं। हालांकि, इसे एक्सएमएल में लागू करने के लिए आपको Encoding प्रॉपर्टी को ओवरराइड करने वाले StringWriter का उपयोग करना StringWriter :

 public class Utf8StringWriter : StringWriter { public override Encoding Encoding => Encoding.UTF8; } 

या यदि आप अभी भी सी # 6 का प्रयोग नहीं कर रहे हैं:

 public class Utf8StringWriter : StringWriter { public override Encoding Encoding { get { return Encoding.UTF8; } } } 

फिर:

 var serializer = new XmlSerializer(typeof(SomeSerializableObject)); string utf8; using (StringWriter writer = new Utf8StringWriter()) { serializer.Serialize(writer, entry); utf8 = writer.ToString(); } 

जाहिर है आप Utf8StringWriter को अधिक सामान्य वर्ग में बना सकते हैं जो अपने कन्स्ट्रक्टर में कोई एन्कोडिंग स्वीकार करता है – परन्तु मेरे अनुभव में यूटीएफ -8 एक StringWriter लिए सबसे अधिक आवश्यक "कस्टम" एन्कोडिंग है

अब जॉन हन्ना कहते हैं, यह अभी भी आंतरिक रूप से यूटीएफ -16 होगा, लेकिन संभवतः आप इसे कुछ बिंदु पर पास करने जा रहे हैं, इसे बाइनरी डेटा में बदलने के लिए … उस बिंदु पर आप ऊपर की स्ट्रिंग का उपयोग कर सकते हैं, इसे यूटीएफ -8 बाइट्स में परिवर्तित करें, और सभी ठीक-ठीक हो जाएंगे – क्योंकि एक्सएमएल घोषणा एन्कोडिंग के रूप में "यूटीएफ -8" निर्दिष्ट करेगा।

संपादित करें: यह काम दिखाने के लिए एक संक्षिप्त लेकिन पूर्ण उदाहरण:

 using System; using System.Text; using System.IO; using System.Xml.Serialization; public class Test { public int X { get; set; } static void Main() { Test t = new Test(); var serializer = new XmlSerializer(typeof(Test)); string utf8; using (StringWriter writer = new Utf8StringWriter()) { serializer.Serialize(writer, t); utf8 = writer.ToString(); } Console.WriteLine(utf8); } public class Utf8StringWriter : StringWriter { public override Encoding Encoding => Encoding.UTF8; } } 

परिणाम:

 <?xml version="1.0" encoding="utf-8"?> <Test xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <X>0</X> </Test> 

"यूटीएफ -8" की घोषित एन्कोडिंग पर ध्यान दें, जो हम चाहते थे, मुझे विश्वास है।

उत्तराधिकार का उपयोग करने के लिए बहुत अच्छा जवाब है, बस प्रारंभकर्ता को ओवरराइड करना याद रखें

 public class Utf8StringWriter : StringWriter { public Utf8StringWriter(StringBuilder sb) : base (sb) { } public override Encoding Encoding { get { return Encoding.UTF8; } } } 

मैंने इस ब्लॉग पोस्ट को पाया जो समस्या को बहुत अच्छी तरह बताता है, और कुछ अलग समाधानों को परिभाषित करता है:

युक्ति: StringBuilder के साथ XmlWriter के लिए UTF8 या अन्य एन्कोडिंग को बल दें

मैंने इस विचार के लिए तय किया है कि ऐसा करने का सबसे अच्छा तरीका है जब स्मृति में XML घोषणा पूरी तरह से रद्द करना यह वास्तव में उस बिंदु पर यूटीएफ -16 वैसे भी है, लेकिन एक्सएमएल घोषणा किसी विशेष एन्कोडिंग के साथ एक फ़ाइल को तब तक नहीं लिखा जाता है जब तक कि यह कोई अर्थ नहीं है; और फिर भी घोषणा आवश्यक नहीं है। यह deserialization तोड़ने के लिए नहीं लगता है, कम से कम

जैसा कि @जॉन हन्ना का उल्लेख है, इसे इस तरह बनाया गया एक XML लेखक के साथ किया जा सकता है:

 XmlWriter writer = XmlWriter.Create (output, new XmlWriterSettings() { OmitXmlDeclaration = true });