JSON无法序列化/反序列化datatable列

时间:2017-02-12 15:01:03

标签: c# json serialization datatable

我有一个数据表,其中数据表的一些列在创建新行时,必须放置此默认值,直到用户更改它。 我使用JSON来序列化和反序列化数据表以进行保存/加载。 使用JSON的序列化/反序列化成功加载了数据表中的先前数据,但它没有带回默认值,并且它们不用于创建新行。 有没有办法强制JSON序列化/反序列化datatable的默认值? 谢谢。 示例代码如下:

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            DataTable dt = new DataTable("ff");
        DataColumn col1 = new DataColumn();
        col1.ColumnName = "dd";
        col1.DataType = typeof(bool);
        col1.DefaultValue = true;
        dt.Columns.Add(col1);
        Console.WriteLine("Before Serialization");
        Console.WriteLine(dt.NewRow()["dd"].ToString());//brings True
        string serializedStr = Newtonsoft.Json.JsonConvert.SerializeObject(dt, serializationetting);
        DataTable deserializedDt = Newtonsoft.Json.JsonConvert.DeserializeObject<DataTable>(serializedStr, serializationetting) as DataTable;
        deserializedDt.Rows.Add(deserializedDt.NewRow());
        Console.WriteLine("After Serialization");
        Console.WriteLine(deserializedDt.NewRow()["dd"]);//brings empty
        Console.ReadLine();

        }
        public static JsonSerializerSettings serializationetting = new JsonSerializerSettings()
        {
            TypeNameAssemblyFormat = FormatterAssemblyStyle.Full,
            TypeNameHandling = TypeNameHandling.Objects,
            Formatting = Formatting.Indented,

        };
    }

}

1 个答案:

答案 0 :(得分:0)

序列化时,您丢失了一些默认列信息。为了保留这一点,似乎你必须序列化DataColumn对象,例如:

string serializedDataCol = Newtonsoft.Json.JsonConvert.SerializeObject(col1, serializationSetting);

您可以在以后反序列化并添加回新的DataTable。我不知道有一种方法可以避免使用NewtonSoft这种行为,但你可能会创建一个自定义合约解析器,可以在DataTable上自动处理这种事情,或者你可以创建另一个用DefaultValue装饰的类,将用OOB合约解析器处理。