3

通常情況下,我儘量保持清晰,並且DataSet s和DataTable s,但是我們目前有一個要求,使用它們似乎有意義。爲什麼當列名包含空格時,我的DataTable不能正確序列化?

我有一些問題,序列化DataTableDataColumn名稱包含空格和列的類型是,我寫了一個自定義類型。

它看起來像序列化過程虛假地添加轉義字符到編碼的列名稱,就好像它已被編碼兩次。 它只會發生,如果我使用我自己的類型作爲列的數據類型,使用typeof(object)工作正常。

這是一個標準功能,如果有的話是否有人知道任何方式?

以下代碼示例演示了此問題。 稱爲「NameWithoutSpaces」一欄被編碼就像「NameWithoutSpaces」 而「名稱用空格」編碼爲「Name_x005F_x0020_With_x005F_x0020_Spaces」 額外x005F字符

當編寫出列正確編碼爲「模式Name_x0020_With_x0020_Spaces「,我猜這是問題的原因,因爲一旦Read *方法被調用,這個列是空的。

根據用於XmlConvert.EncodeName的空間應與x0020005F被編碼的文檔用作ESCAP炭。 所以,我們得到的結果似乎是如果文本通過這種機制編碼兩次會發生什麼。

namespace DataTableSerialization 
{ 
    using System.Data; 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      var dataTable = CreateDataTable(); 

      var row1 = dataTable.NewRow(); 
      row1.ItemArray = new object[] { new Item {Value = "Data1"}, new Item {Value = "Data2"} }; 
      dataTable.Rows.Add(row1); 

      dataTable.WriteXml(@"C:\datatable.xml"); 
      dataTable.WriteXmlSchema(@"C:\schema.xml"); 

      var dataTable2 = new DataTable(); 
      dataTable2.ReadXmlSchema(@"C:\schema.xml"); 
      dataTable2.ReadXml(@"C:\datatable.xml"); 
     } 

     private static DataTable CreateDataTable() 
     { 
      var table = new DataTable { TableName = "Table" }; 

      var col1 = new DataColumn("NameWithoutSpaces", typeof(Item)); 
      var col2 = new DataColumn("Name With Spaces", typeof(Item)); 

      table.Columns.Add(col1); 
      table.Columns.Add(col2); 

      return table; 
     } 
    } 

    public class Item 
    { 
     public string Value { get; set; } 
    } 
} 
+0

爲什麼要避免如此強大的班? – AMissico 2012-03-01 14:55:07

+0

(刪除我的回答,因爲我認爲我誤解了你的問題的本質) – 2012-03-01 14:59:57

+0

有趣的是,它適用於更多的基本類型;它只是你的自定義'Item',受此影響 – 2012-03-01 15:02:11

回答

0

不僅要使用Serializable屬性,你還需要實現IXmlSerializable用於自定義類型在數據集中正確序列化。我的數據集返回空列,直到我實現了IXmlSerializable。

UDT必須支持通過符合XML序列化協議的XML數據類型的轉換。 System.Xml.Serialization命名空間包含用於將對象序列化爲XML格式文檔或流的類。您可以選擇使用IXmlSerializable接口來實現xml序列化,該接口爲XML序列化和反序列化提供自定義格式。

除了從UDT進行顯式轉換爲XML,XML序列化,您可以:

使用XQuery在UDT實例的值轉換爲XML數據類型之後。

在SQL Server中使用Native XML Web Services的參數化查詢和Web方法中使用UDT。

使用UDT接收XML數據的批量加載。

序列化包含具有UDT列的表的數據集。

UDT在FOR XML查詢中未被序列化。要執行顯示UDT的XML序列化的FOR XML查詢,請在SELECT語句中將每個UDT列顯式轉換爲xml數據類型。您還可以將列顯式轉換爲varbinary,varchar或nvarchar。

http://msdn.microsoft.com/en-us/library/system.xml.serialization.ixmlserializable.aspx

優點使用IXmlSerializable的 http://technet.microsoft.com/en-us/library/ms131082.aspx

相關問題