2016-07-07 3 views
6

जब एक वर्ग seralizing और एक फाइल करने के लिए बचत, कभी कभी एक त्रुटि होता है, जहां धारावाहिक उत्पादन इस तरह दिखता है:एक्सएमएल सीरियलाइजेशन अंत में यादृच्छिक तार पैदा करता है? सी #

[Serializable] 
public class Template 
{ 
    public string Route = string.Empty; 
    public string TradePack = string.Empty; 
    public string Transport = string.Empty; 

    public Template() 
    { 

    } 
} 

मैं: इस तरह

<?xml version="1.0"?> 
<Template xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Route>Some Route</Route> 
    <TradePack>Something Here</TradePack> 
    <Transport /> 
</Template>te> ------> Notice this extra string? 

वर्ग मैं serializing कर रहा हूँ दिखता ऐसा नहीं लगता कि यह क्यों हो रहा है। यहां मेरा सीरिएलाइज़र क्लास है:

public static bool Save(object obj, string path) 
    { 
     try 
     { 
      XmlSerializer writer = new XmlSerializer(obj.GetType()); 

      using (var stream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite)) 
      { 
       writer.Serialize(stream, obj); 
      } 

      return true; 
     } 
     catch { } 
     return false; 
    } 

धन्यवाद!

+3

मुझे एक बार एक ही समस्या थी, मेरे अंत में यह गलती थी कि फाइल पूरी तरह से साफ नहीं हुई थी। यह हमेशा एक टुकड़ा छोड़ दिया गया था। इससे पहले कि आप इसे लिखने से पहले फ़ाइल हटा दें। –

+0

आह समझ में आता है, धन्यवाद! :) –

+0

तो, जैसा कि मैंने उम्मीद की थी। यह लगभग यादृच्छिक नहीं है;)। – Aphelion

उत्तर

8

अतिरिक्त आउटपुट आउटपुट फ़ाइल के पिछले संस्करण (उसी नाम वाले) से बचे हुए होने की संभावना है।

आप FileModeOpenOrCreate से Create पर केवल FileMode को बदलकर समस्या का समाधान कर सकते हैं। इस तरह आउटपुट फ़ाइल को छोटा कर दिया गया है यदि यह पहले से मौजूद है।

एक भी सरल विधि File.Create(path) उपयोग करने के लिए होगा:

XmlSerializer writer = new XmlSerializer(obj.GetType()); 
using (var stream = File.Create(path)) 
{ 
    writer.Serialize(stream, obj); 
} 

एक अलग रूप में के रूप में: यह सिर्फ अपवाद बबल सामने जाने के लिए कॉल स्टैक जब तक आप कुछ उन लोगों के साथ सार्थक कर सकते हैं आमतौर पर बेहतर है। बस चुपचाप अपवाद को निगल रहा है और बदले में एक स्टेटस फ्लैग लौटा रहा है जिसे कभी भी चेक नहीं किया जा सकता है, वास्तविक समस्या को छुपाता है, इससे बाद में और समस्याएं हो सकती हैं और समस्या विश्लेषण अनावश्यक रूप से मुश्किल हो जाता है।

+0

और चलिए 'File.Create (पथ)' शॉर्टकट का उल्लेख करते हैं। –

+0

मैंने फ़ाइलमोड को ट्रंकेट में बदल दिया है और फ़ाइल को पहले से ही बना दिया है यदि यह अभी तक मौजूद नहीं है। –

+0

@ हेनकहोल्टरमैन यह वास्तव में बहुत काम नहीं है, इसके अलावा मुझे आवश्यक होने पर बाहरी libs का उपयोग करना पसंद नहीं है। –

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