2011-05-07 17 views
5

मैं DataContractSerializer का उपयोग कर रहा हूं यदि अपवाद हैं तो EF4 ऑब्जेक्ट्स को XML में क्रमबद्ध करने के लिए। मेरे डीबग लॉग में मैं देख सकता हूं कि कुछ गलत होने पर डेटा-सामग्री चाहिए।स्ट्रिंगवाइटर को DataContractSerializer क्यों छोटा कर दिया गया है?

मेरे पास कोड के दो संस्करण हैं: एक संस्करण जो फ़ाइल को क्रमबद्ध करता है और एक जो StringWriter का उपयोग कर स्ट्रिंग को क्रमबद्ध करता है।

जब बड़ी वस्तुओं को फ़ाइल करने के लिए क्रमबद्ध किया जाता है तो मुझे लगभग 16kb का वैध xml मिलता है। जब xml स्ट्रिंग करने के लिए एक ही आइटम को क्रमबद्ध करना 12kb के बाद छोटा कर दिया जाता है। किसी भी विचार से छिड़काव क्या हुआ?

... 
    var entity = .... 
    SaveAsXml(entity, @"c:\temp\EntityContent.xml"); // ok size about 16100 btes 
    var xmlString = GetAsXml(entity); // not ok, size about 12200 bytes 

    // to make shure that it is not Debug.Writeline that causes the truncation 
    // start writing near the end of the string 
    // only 52 bytes are written although the file is 16101 bytes long 
    System.Diagnostics.Debug.Writeline(xml.Substring(12200)); 

कोई भी विचार क्यों मेरी स्ट्रिंग काटा गया है?

यहाँ फाइल करने के लिए क्रमानुसार करने कोड है कि ठीक से काम करता है

public static void SaveAsXml(object objectToSave, string filenameWithPath) 
    { 
    string directory = Path.GetDirectoryName(filenameWithPath); 
    if (!Directory.Exists(directory)) 
    { 
     logger.Debug("Creating directory on demand " + directory); 
     Directory.CreateDirectory(directory); 
    } 

    logger.DebugFormat("Writing xml to " + filenameWithPath); 
    var ds = new DataContractSerializer(objectToSave.GetType(), null, Int16.MaxValue, true, true, null); 

    var settings = new XmlWriterSettings 
    { 
     Indent = true, 
     IndentChars = " ", 
     NamespaceHandling = NamespaceHandling.OmitDuplicates, 
     NewLineOnAttributes = true, 
    }; 
    using (XmlWriter w = XmlWriter.Create(filenameWithPath, settings)) 
    { 
     ds.WriteObject(w, objectToSave); 
    } 
    } 

यहाँ कोड है कि स्ट्रिंग कि

public static string GetAsXml(object objectToSerialize) 
    { 
    var ds = new DataContractSerializer(objectToSerialize.GetType(), null, Int16.MaxValue, true, true, null); 
    var settings = new XmlWriterSettings 
    { 
     Indent = true, 
     IndentChars = " ", 
     NamespaceHandling = NamespaceHandling.OmitDuplicates, 
     NewLineOnAttributes = true, 
    }; 
    using (var stringWriter = new StringWriter()) 
    { 
     using (XmlWriter xmlWriter = XmlWriter.Create(stringWriter, settings)) 
     { 
      try 
      { 
       ds.WriteObject(xmlWriter, objectToSerialize); 
       return stringWriter.ToString(); 
      } 
      catch (Exception ex) 
      { 
       return "cannot serialize '" + objectToSerialize + "' to xml : " + ex.Message; 
      } 
     } 
    } 
    } 

उत्तर

8

छोटा कर दिया जाएगा करने के लिए serializes है XmlWriter के उत्पादन पूरी तरह से नहीं हो सकता है StringWriter पर ToString() का आह्वान करते समय फ़्लश किया गया। ऐसा करने से पहले XmlWriter ऑब्जेक्ट का निपटान करने का प्रयास करें:

try 
{ 
    using (var stringWriter = new StringWriter()) 
    { 
     using (XmlWriter xmlWriter = XmlWriter.Create(stringWriter, settings)) 
     { 
      ds.WriteObject(xmlWriter, objectToSerialize); 
     } 
     return stringWriter.ToString(); 
    } 
} 
catch (Exception ex) 
{ 
    return "cannot serialize '" + objectToSerialize + "' to xml : " + ex.Message; 
} 
+1

+1: समाधान समाधान के लिए धन्यवाद। 'XmlWriter.Flush(); 'वापस करने से पहले' स्ट्रिंग स्ट्रिंगवाइटर। टॉस्ट्रिंग();' काम करता है। – k3b

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