2017-02-12 47 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

如果可能的話,甚至可以讓自定義解析器查找正確的默認值並設置它們,而不是試圖序列化所有列。 –