2009-07-12 10 views
8

मेरे पास [XmlText] के साथ चिह्नित संपत्ति वाला एक वर्ग है, जो मल्टीलाइन इनपुट स्वीकार करता है। मेरी एक्सएमएल फ़ाइल में, मैंने सत्यापित किया है कि पाठ सामग्री के अंदर लाइन समाप्ति "\r\n" है, जो बाकी फ़ाइल के समान है।एक्सएमएल deserialization 'मानकीकरण' लाइन अंत, इसे कैसे रोकें? (.NET)

कोड मैं deserialize करने के लिए उपयोग कर रहा हूँ है:

XmlSerializer configSerializer = new XmlSerializer(typeof(WorldList)); 
string file = "test.xml"; 

if (File.Exists(file)) 
{ 
    using (TextReader r = new StreamReader(file)) 
    { 
     foo = configSerializer.Deserialize(r); 
    } 
} 

लेकिन, [XmlText] संपत्ति के लिए सेटर के अंदर, value पहले से ही "\n" एक लाइन समाप्त होने के रूप में है। इसका मुख्य कारण यह कष्टप्रद है क्योंकि "\n" लाइन एंडिंग TextBox में ठीक से प्रदर्शित नहीं होता है ... मुझे बिल्कुल यकीन नहीं है कि कौन सा हिस्सा समस्याएं पैदा कर रहा है, लेकिन मैंने सोचा कि यहां कोई व्यक्ति स्थिति पर कुछ प्रकाश डालने में सक्षम हो सकता है ।

उत्तर

10

मैं यह आसान जल्दी से एक सी # विकास के वातावरण में कोड डाल करने के लिए बनाने के लिए नमूना कोड बदल दिया है। मैंने जानबूझकर बयानों का उपयोग करके शामिल नहीं किया है- यह केवल नमूना कोड है। हम को क्रमानुसार और जिस तरह से आप लाइन जहां "वही" बाहर प्रिंट हो निष्पादित नहीं किया जाएगा वर्णन में इस deserialize करने का प्रयास करें

public class DataToSerialize 
    { 
     public string Name { get; set; } 
    } 

:

उदाहरण हम वर्ग का पालन किया है के लिए हम को क्रमानुसार करना चाहते हैं (मैं कोड Environment.NewLine के साथ विंडोज पर चलेगा यह सोचते हैं रहा हूँ, के साथ बदलें "\ r \ n" अगर आप नहीं कर रहे हैं):

DataToSerialize test = new DataToSerialize(); 
    test.Name = "TestData" + Environment.NewLine; 
    XmlSerializer configSerializer = new XmlSerializer(typeof(DataToSerialize)); 
    MemoryStream ms = new MemoryStream(); 
    StreamWriter sw = new StreamWriter(ms); 
    configSerializer.Serialize(sw, test); 
    ms.Position = 0; 
    DataToSerialize deserialized = (DataToSerialize)configSerializer.Deserialize(ms); 
    if (deserialized.Name.Equals("TestData" + Environment.NewLine)) 
    { 
     Console.WriteLine("Same"); 
    } 

हालांकि इस, ठीक किया जा सकता मैन्युअल रूप से करने के लिए एक XmlTextReader बताए द्वारा serializer, इसकी सामान्यीकरण संपत्ति झूठी पर सेट (एक उपयोग घ serializer में डिफ़ॉल्ट रूप से सही पर सेट है):

DataToSerialize test = new DataToSerialize(); 
    test.Name = "TestData" + Environment.NewLine; 
    XmlSerializer configSerializer = new XmlSerializer(typeof(DataToSerialize)); 
    MemoryStream ms = new MemoryStream(); 
    StreamWriter sw = new StreamWriter(ms); 

    configSerializer.Serialize(sw, test); 
    ms.Position = 0; 
    XmlTextReader reader = new XmlTextReader(ms); 
    reader.Normalization = false; 
    DataToSerialize deserialized = (DataToSerialize)configSerializer.Deserialize(reader); 
    if (deserialized.Name.Equals("TestData" + Environment.NewLine)) 
    { 
     Console.WriteLine("Same"); 
    } 

वही अब बाहर मुद्रण किया जाएगा, जो जब तक मैं गलत व्यवहार की आवश्यकता है कर रहा हूँ?

+1

मुझे यह पसंद है ;-p –

+2

हालांकि रिकॉर्ड के लिए, नमूना कोड में कथन का उपयोग करने की कमी से मेरी राय में पढ़ना मुश्किल हो जाता है ... उपयोग करने में कुछ भी गलत नहीं है। –

+0

@ मैथ्यू- मुझे लगता है कि यह उन व्यक्तिपरक चीजों में से एक है- साबित करने के लिए कि एक दूसरे से बेहतर है जिसे आपको वास्तव में नियंत्रित प्रयोग करने की आवश्यकता होगी। मेरे जवाब के साथ यह थोड़ा अजीब है क्योंकि मेमोरीस्ट्रीम को क्रमबद्धरण और deserialization दोनों में scoped किया जाना चाहिए, जो असली दुनिया में नहीं होगा। बयान का उपयोग करने वाले आपके प्रश्न के मामले में उपयोगी है (मेरी राय में)। जब मैं कोड लिख रहा था तो मैंने वास्तव में उपयोग कथन शामिल किए थे, लेकिन उत्तर पोस्ट करते समय उन्हें बाहर निकाल दिया (मेरा दिमाग FXCop शिकायत को रोकने के लिए वायर्ड किया गया है)। – RichardOD

4

यदि आप serializing थे, तो XmlWriterSettings.NewLineHandling (Replace) कोशिश कर रहा लायक हो सकता है - लेकिन यह पढ़ मदद नहीं करेगा। थोड़ा grungy, लेकिन शायद यह सीधे सेटर में कार्य करें:

private string text; 
[XmlText] 
public string Text { 
    get { return text; } 
    set 
    { 
     Regex r = new Regex("(?<!\r)\n"); 
     text = r.Replace(value, "\r\n"); 
    } 
} 
+0

हाँ, मैं सोच रहा था कि रेगेक्स प्रतिस्थापन एकमात्र समाधान हो सकता है, लेकिन मुझे आशा थी कि कुछ "बेहतर तरीका" [टीएम] –

+0

एक और तरीका है, मैं नहीं कहूंगा कि यह बेहतर था- मैं एक पोस्ट करूंगा जल्द ही जवाब दें। – RichardOD

+0

रेगेक्स \ n \ n के बजाय केवल \ n उपयोग होने पर पता लगाने का एक अच्छा उदाहरण है। – RichardOD

संबंधित मुद्दे