默认情况下,Settings类不会将DateTime类型的信息存储到配置文件中,如何序列化DateTime,以便在保存和检索时保持类型不变?
希望这会有所帮助。我使用Json.NET库来进行序列化和内存流。您需要做的第一件事是确保DateTime对象具有您期望的Kind。我使用LINQPad.NET创建了这个小演示。我使用了传说中的转储方法
.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的anwers更简单的解决方案,所以我用一个解决方案来回答我自己的问题。尽管这并不能详尽地回答我最初的问题,但在我的情况下,使用访问器并假设Utc时间可以完成任务:
internal static DateTime MyDate
{
get { return DateTime.SpecifyKind(Properties.Settings.Default.MyDate, DateTimeKind.Utc); }
set { Properties.Settings.Default.MyDate = value.ToUniversalTime(); }
}