2010-10-04 80 views
1

我創建了一個方法,接受一個對象,然後嘗試序列化對象到Xml,首先使用XmlSerializer將序列化爲一個字符串,然後將Xml加載回XmlDocument對象以返回該方法。代碼看起來像這樣;C#XML序列化問題

public static XmlDocument ConvertObjectToXMLMessage(object ObjectToConvert) 
    { 
     MemoryStream stream = null; 
     XmlWriter writer = null; 
     XmlSerializer serializer = null; 
     XmlDocument xmlDoc = new XmlDocument(); 
     UnicodeEncoding utf = new UnicodeEncoding(); 
     UTF8Encoding utf8 = new UTF8Encoding(); 
     ASCIIEncoding ascii = new ASCIIEncoding(); 
     string result = string.Empty; 

     try 
     { 
      stream = new MemoryStream(); 
      //writer = new StreamWriter(stream, Encoding.Unicode); 
      XmlWriterSettings settings = new XmlWriterSettings(); 
      settings.Encoding = Encoding.UTF8; 
      writer = XmlWriter.Create(stream, settings);     

      serializer = new XmlSerializer(ObjectToConvert.GetType()); 
      serializer.Serialize(writer, ObjectToConvert); 

      int count = Convert.ToInt32(stream.Length); 
      Byte[] arr = new Byte[count]; 

      stream.Seek(0, SeekOrigin.Begin); 

      stream.Read(arr, 0, count); 

      result = utf8.GetString(arr).Trim(); 

      // if this is being used during a debug session, the xml will be written to the Debug Console 
#if DEBUG 
      //blank line before 
      Debug.WriteLine(string.Empty); 
      // output result 
      Debug.Write(result); 
      //blank line after 
      Debug.WriteLine(string.Empty); 
#endif 

      xmlDoc.LoadXml(result); 

      return xmlDoc; 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
     finally 
     { 
      if (writer != null) 
       writer.Close(); 
     } 
    } 

所有工作良好,直到xmlDoc.LoadXml(result)命令。這會引發異常; {「根級別的數據無效,第1行,第1位。」}

正如您所看到的,我已經聲明瞭一些編碼變量。如果我使用ASCII編碼,它可以工作。我需要使用UTF8。

任何想法,爲什麼這是行不通的?我認爲這是因爲在Xml序列化開始時插入了虛假字符。我如何避免這種情況?我可以序列化的類的類型將是實體框架對象或從XSD或WSDL生成的代理分類。

回答

1

如果您直接加載流而無需手動讀取或轉換它,該怎麼辦?

XmlDocument xd = new XmlDocument(); 
xd.Load(stream); 

這將至少減少錯誤發生的位置數。

+0

的編輯器的問題{「缺少根元素。」} – Carl 2010-10-04 16:22:05

+0

@Carl什麼是流的長度?只是檢查它不是空的(因爲你會得到相同的錯誤)。 – 2010-10-04 16:24:55

+0

蒂姆,它不是空的。我認爲,但肯定有內容。 – Carl 2010-10-04 16:28:12

0

該代碼似乎很好......你是否在嘗試通過代碼訪問你的文件之前打開一個編輯器?

我買了這是在我的文件中添加一些東西

+0

我以爲這也很好!我不能用編輯器先打開它,因爲它全部在內存中。 – Carl 2010-10-04 16:24:58