【发布时间】:2011-10-03 07:17:31
【问题描述】:
使用 protobuf-net.dll 版本 1.0.0.280
当我反序列化 DateTime(包装在对象中)时,日期/时间没问题,但 DateTime.Kind 属性是“未指定”
考虑这个测试用例来序列化/反序列化一个 DateTime。
[TestMethod]
public void TestDateTimeSerialization()
{
var obj = new DateTimeWrapper {Date = DateTime.UtcNow};
obj.Date = DateTime.SpecifyKind(obj.Date, DateTimeKind.Utc);
var serialized = obj.SerializeProto();
var deserialized = serialized.DeserializeProto<DateTimeWrapper>();
Assert.AreEqual(DateTimeKind.Utc, deserialized.Date.Kind);
}
public static byte[] SerializeProto<T>(this T item) where T : class
{
using (var ms = new MemoryStream())
{
Serializer.Serialize(ms, item);
return ms.ToArray();
}
}
public static T DeserializeProto<T>(this byte[] raw) where T : class, new()
{
using (var ms = new MemoryStream(raw))
{
return Serializer.Deserialize<T>(ms);
}
}
断言失败,种类 == Unspecified
附录
由于protobuf-net 未序列化此属性(见下文),一种解决方案是在客户端显示日期时假设DateTimeKind 等于 Utc(仅在您知道它的地方当然应该是UTC):
public static DateTime ToDisplayTime(this DateTime utcDateTime, TimeZoneInfo timezone)
{
if (utcDateTime.Kind != DateTimeKind.Utc)//may be Unspecified due to serialization
utcDateTime = DateTime.SpecifyKind(utcDateTime, DateTimeKind.Utc);
DateTime result = TimeZoneInfo.ConvertTime(utcDateTime, timezone);
return result;
}
这使您不必在接收方分配给每个DateTime 属性。
【问题讨论】:
标签: c# .net serialization protobuf-net globalization