दिलचस्प पोस्ट
सी में आप stdin / stdout / stderr को एक execvp () या समान कॉल करते समय फ़ाइलों में कैसे रीडायरेक्ट करते हैं? निष्पादन योग्य का पथ प्राप्त करें जब मैं अपनी वेबसाइट को रीफ़्रेश करता हूं मुझे 404 मिलता है। यह अंगुलर 2 और फायरबेस के साथ है किसी POST NSURLRequest पर डेटा संलग्न करें मेरी। Vimrc फ़ाइल कहां है? AngularJ में इंटरनेट कनेक्शन की जांच कैसे करें आप PostgreSQL में एक पठन-योग्य उपयोगकर्ता कैसे बना सकते हैं? जैक्सन का उपयोग करके JSON स्ट्रिंग को सुंदर प्रिंट JSON आउटपुट में कनवर्ट करें मैं एमएस एक्सेस डाटाबेस से टेबल नाम कैसे प्राप्त करूं? HTTP प्रोटोकॉल में कुकीज़ कैसे पारित की जाती हैं? urlencoded फॉरवर्ड स्लैश यूआरएल टूट रहा है SOAP आधारित सेवाओं के बजाय एक का उपयोग क्यों करेगा? PHP में बहुआयामी सरणी छंटनी PostgreSQL में कई-से-कई रिश्तों को कैसे कार्यान्वित करें? नियमित अभिव्यक्ति मिलान

एक ऑब्जेक्ट को यूटीएफ -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(); 

वेब के समाधान से एकत्रित समाधान "एक ऑब्जेक्ट को यूटीएफ -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 });