【发布时间】:2015-11-16 17:33:25
【问题描述】:
默认情况下,Settings 类不会将 DateTime 类型的信息存储到配置文件中,我如何将 DateTime 序列化,以便保存和检索时保持类型不变?
【问题讨论】:
标签: c# datetime application-settings
默认情况下,Settings 类不会将 DateTime 类型的信息存储到配置文件中,我如何将 DateTime 序列化,以便保存和检索时保持类型不变?
【问题讨论】:
标签: c# datetime application-settings
希望这会有所帮助。我使用Json.NET 库来进行序列化和内存流。您需要做的第一件事是确保您的 DateTime 对象具有您期望它具有的 Kind。我使用LINQPad.NET 创建了这个小演示。我利用了传说中的Dump方法
.Dump()
此方法将获取 .NET DateTime 对象并将值输出到结果窗口。如您所见,我已针对您询问的 Kind 属性。
void Main()
{
var date = new DateTime(2015, 12, 25, 0, 0, 0, DateTimeKind.Local);
date.Kind.Dump();
using (var memoryStream = new MemoryStream())
{
Serialize(date, memoryStream);
memoryStream.Position = 0;
var deserializedDate = Deserialize<DateTime>(memoryStream);
deserializedDate.Kind.Dump();
}
}
// Define other methods and classes here
public static void Serialize( object value, Stream s )
{
StreamWriter writer = new StreamWriter(s);
JsonTextWriter jsonWriter = new JsonTextWriter(writer);
JsonSerializer ser = new JsonSerializer();
ser.Serialize(jsonWriter, value);
writer.Flush();
}
public static T Deserialize<T>(Stream s)
{
T result;
using (StreamReader reader = new StreamReader(s))
{
JsonTextReader jsonReader = new JsonTextReader(reader);
JsonSerializer ser = new JsonSerializer();
result = ser.Deserialize<T>(jsonReader);
}
return result;
}
使用此演示代码并将本地类型从 DateTimeKind.Local 更改为 DateTimeKind.Utc 并验证这是否适合您。如果您有任何问题,我很乐意为您提供帮助。
【讨论】:
我一直在寻找比 dacke.geo 的答案更简单的解决方案,所以我正在用我解决的解决方案来回答我自己的问题。虽然这并没有详尽地回答我最初的问题,但使用访问器并假设 Utc 时间可以完成我的工作:
internal static DateTime MyDate
{
get { return DateTime.SpecifyKind(Properties.Settings.Default.MyDate, DateTimeKind.Utc); }
set { Properties.Settings.Default.MyDate = value.ToUniversalTime(); }
}
【讨论】: