通常我尽量远离 DataSet
和 DataTable
,但我们目前有一个使用它们似乎有意义的要求。
当 DataColumn
名称包含空格并且列的类型是我编写的自定义类型时,我在序列化 DataTable
时遇到了一些问题。
看起来序列化过程在编码的列名中虚假地添加了转义字符,就好像它被编码了两次一样。
只有当我使用自己的类型作为列的数据类型时才会发生这种情况,使用 typeof(object)
可以正常工作。
这是一项标准功能吗?如果是,有人知道有什么解决办法吗?
以下代码示例演示了该问题。 名为“NameWithoutSpaces”的列被编码为“NameWithoutSpaces” 而“带空格的名称”被编码为“Name_x005F_x0020_With_x005F_x0020_Spaces” 带有额外的 x005F 个字符
当写出架构时,该列正确编码为“Name_x0020_With_x0020_Spaces”,我猜这是问题的原因,因为调用 Read* 方法后该列为空白。
根据 XmlConvert.EncodeName 的文档空格应使用 x0020 编码,005F 用作转义字符。 所以,我们得到的结果似乎是如果文本通过这种机制被编码两次会发生什么。
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; }
}
}
最佳答案
您必须将 Serializable 属性设置为您的自定义对象类。
[Serializable]
public class Item
{
public string Value { get; set; }
}
这篇文章给你http://www.codeproject.com/Articles/1789/Object-Serialization-using-C
关于.net - 当列名包含空格时,为什么我的 DataTable 不能正确序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9518276/