2017-02-12 11 views
2

私はデータテーブルのいくつかの列に新しい行を作成するときに、このデフォルト値をユーザーが変更するまで配置する必要があります。 JSONを使用して、セーブ/ロード用のデータテーブルをシリアライズしてデシリアライズしました。 JSONを使用したシリアル化/逆シリアル化では、データテーブル内の以前のデータは正常に読み込まれますが、デフォルト値は戻されず、新しい行の作成には使用されません。 JSONにdatatableのデフォルト値をシリアライズ/デシリアライズさせる方法はありますか?ありがとう。 サンプルコードは以下の通りです: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オブジェクトをシリアル化する必要があるだろうと思われる:あなたは、後にデシリアライズし、新しいDataTableに戻って追加することができ

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

。私はNewtonSoftを使ってこの振る舞いを避ける方法があるのか​​どうかはわかりませんが、DataTableで自動的にこの種のものを処理するカスタム契約リゾルバを作成するか、あるいは別のクラスを作成することができますOOB契約のリゾルバで処理されるDefaultValueで飾ります。

+0

残念なことに、JSONを使用して、すべてのタイプのユーザー定義クラスを含む非常に大きなクラスをシリアライズしました。それぞれのクラスにはデータテーブルが含まれています。また、いくつかのデータテーブルには列の無限数を含めることができ、条件に依存します。 – all

+0

カスタム契約リゾルバを使用して、シリアライザ/デシリアライザを設定して、クラスにカスタムリゾルバを使用するように設定します。そこには、期待どおりにデータ型を直列化および逆直列化するための論理を取り除くことができます。 –

+0

可能であれば、カスタムリゾルバにすべての列をシリアル化するのではなく、正しいデフォルトを検索して設定する方がよい場合もあります。 –

関連する問題