我有一个数据表,其中数据表的一些列在创建新行时,必须放置此默认值,直到用户更改它。 我使用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,
};
}
}
答案 0 :(得分:0)
序列化时,您丢失了一些默认列信息。为了保留这一点,似乎你必须序列化DataColumn
对象,例如:
string serializedDataCol = Newtonsoft.Json.JsonConvert.SerializeObject(col1, serializationSetting);
您可以在以后反序列化并添加回新的DataTable
。我不知道有一种方法可以避免使用NewtonSoft这种行为,但你可能会创建一个自定义合约解析器,可以在DataTable
上自动处理这种事情,或者你可以创建另一个用DefaultValue
装饰的类,将用OOB合约解析器处理。