2017-02-12 91 views
2

我有一个数据表,其中创建新行的数据表中的某些列的数据表中必须放置此默认值,直到用户更改为止。 我已经使用JSON对保存/加载的数据表进行序列化和反序列化。 使用JSON的序列化/反序列化成功加载数据表中的先前数据,但它不会恢复默认值,并且不会用于创建新行。 有没有办法强制JSON序列化/反序列化数据表的默认值? 谢谢。 示例代码如下:JSON无法序列化/反序列化数据表列的缺省值

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, 

     }; 
    } 

} 
+0

显示您的代码。 –

+0

我已添加代码。 – all

回答

0

当你序列化,你失去你的一些默认列信息。要保留,看来你不得不序列化对象DataColumn以及,例如:

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

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

+0

不幸的是我已经使用JSON来序列化一个非常大的类,其中包含我所有用户定义类的类型,每个类都可以包含一个数据表,我认为我不能为它们做所有类型的类。还有一些数据表可以包含不确定的列,它取决于条件! – all

+0

然后使用自定义合约解析器,并设置您的序列化器/反序列化器以使用您的类的自定义解析器。在那里你应该能够隐藏逻辑来按照你的期望序列化和反序列化数据表。 –

+0

如果可能的话,甚至可以让自定义解析器查找正确的默认值并设置它们,而不是试图序列化所有列。 –