我想使用JSON.Net序列化为BSON,但原始偏移似乎不被尊重。JSON.Net BSON序列化不正确地处理DateTimeOffset?
你能看到一个问题,我试图让这项工作?
[Test]
public void SerializeDateTimeOffsetToBson()
{
var serializer = new Newtonsoft.Json.JsonSerializer {
TypeNameHandling = TypeNameHandling.Auto,
DateParseHandling = DateParseHandling.DateTimeOffset,
DateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind
};
var negOffset = new DateTimeOffset(2014, 7, 10, 0, 0, 0, new TimeSpan(-5, 0, 0));
var gmtOffset = new DateTimeOffset(2014, 7, 10, 0, 0, 0, new TimeSpan());
var posOffset = new DateTimeOffset(2014, 7, 10, 0, 0, 0, new TimeSpan(5, 0, 0));
var dt = new {
negOffset = negOffset,
gmtOffset = gmtOffset,
posOffset = posOffset
};
byte[] serialized;
using (var ms = new MemoryStream())
using (var writer = new BsonWriter(ms)) {
serializer.Serialize(writer, dt);
writer.Close();
serialized = ms.ToArray();
}
dynamic deserializedDt;
using (var ms = new MemoryStream(serialized))
using (var rdr = new BsonReader(ms)) {
deserializedDt = (dynamic)serializer.Deserialize(rdr);
rdr.Close();
}
Assert.IsTrue(deserializedDt.negOffset == dt.negOffset);
Assert.IsTrue(deserializedDt.posOffset == dt.posOffset);
Assert.IsTrue(deserializedDt.gmtOffset == dt.gmtOffset);
}
这三个断言都会失败。
反序列化后,deserializedDt.negOffset
是2014年7月9日晚上10点用的偏移-07:00(计算机的当前时区),deserializedDt.posOffset
是2014年7月9日下午12点与的偏移-07:00,和deserializedDt.gmtOffset
是7月9日2014下午5点,抵消-07:00。
在.Net 4.0项目中使用JSON.Net 8.0.3。
UPDATE ------------------
经过进一步调查,我在https://github.com/JamesNK/Newtonsoft.Json/issues/898
与使用BSON重复使用JSON的情况相同,何时他们会使用rn:http://www.hanselman.com/blog/OnTheNightmareThatIsJSONDatesPlusJSONNETAndASPNETWebAPI.aspx – mms