с использованием 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
свойству на принимающей стороне.