通常情況下,我儘量保持清晰,並且DataSet
s和DataTable
s,但是我們目前有一個要求,使用它們似乎有意義。爲什麼當列名包含空格時,我的DataTable不能正確序列化?
我有一些問題,序列化DataTable
當DataColumn
名稱包含空格和列的類型是,我寫了一個自定義類型。
它看起來像序列化過程虛假地添加轉義字符到編碼的列名稱,就好像它已被編碼兩次。 它只會發生,如果我使用我自己的類型作爲列的數據類型,使用typeof(object)
工作正常。
這是一個標準功能,如果有的話是否有人知道任何方式?
以下代碼示例演示了此問題。 稱爲「NameWithoutSpaces」一欄被編碼就像「NameWithoutSpaces」 而「名稱用空格」編碼爲「Name_x005F_x0020_With_x005F_x0020_Spaces」 額外x005F字符
當編寫出列正確編碼爲「模式Name_x0020_With_x0020_Spaces「,我猜這是問題的原因,因爲一旦Read *方法被調用,這個列是空的。
根據用於XmlConvert.EncodeName的空間應與x0020和005F被編碼的文檔用作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; }
}
}
爲什麼要避免如此強大的班? – AMissico 2012-03-01 14:55:07
(刪除我的回答,因爲我認爲我誤解了你的問題的本質) – 2012-03-01 14:59:57
有趣的是,它適用於更多的基本類型;它只是你的自定義'Item',受此影響 – 2012-03-01 15:02:11