protobuf-net неправильно десериализует DateTime.Kind

с использованием protobuf-net.dll версии 1.0.0.280

Когда я десериализую DateTime (завернутый в объект) дата / время в порядке, но свойство DateTime.Kind имеет значение «Unspecified»

Рассмотрим этот тестовый пример для сериализации / десериализации 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);
    }
}

Assert терпит неудачу, the Kind == Unspecified

Addendum

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

18
задан i3arnon 5 October 2015 в 18:12
поделиться