private static void TestSerializationCore(SerializationContext context, DateTimeConversionMethod expected) { Assert.That(context.DefaultDateTimeConversionMethod, Is.EqualTo(expected)); var now = Timestamp.UtcNow; var dateTimeNow = now.ToDateTimeOffset(); var source = new ClassHasTimestamp { Timestamp = now, DateTime = dateTimeNow.AddSeconds(1).UtcDateTime, DateTimeOffset = dateTimeNow.AddSeconds(2), #if (!SILVERLIGHT || WINDOWS_PHONE) && !XAMARIN && !UNITY && !UNITY FileTime = now.Add(TimeSpan.FromSeconds(3)).ToDateTime().ToWin32FileTimeUtc() #endif // ( !SILVERLIGHT || WINDOWS_PHONE ) && !XAMARIN && !UNITY && !UNITY }; using (var buffer = new MemoryStream()) { var serializer = context.GetSerializer <ClassHasTimestamp>(); serializer.Pack( buffer, source ); // Test representation buffer.Position = 0; var native = MessagePackSerializer.UnpackMessagePackObject(buffer); Assert.That(native.IsArray, Is.True); var nativeMembers = native.AsList(); Assert.That(nativeMembers.Count, Is.EqualTo(ClassHasTimestamp.MemberCount)); for (var i = 0; i < ClassHasTimestamp.MemberCount; i++) { switch (expected) { case DateTimeConversionMethod.Native: { if (i == 2) { // DateTimeOffset -> [long, shourt] Assert.That(nativeMembers[i].IsArray, Is.True); var dtoComponents = nativeMembers[i].AsList(); Assert.That(dtoComponents.Count, Is.EqualTo(2)); Assert.That(dtoComponents[0].IsTypeOf <long>(), Is.True); Assert.That(dtoComponents[1].IsTypeOf <short>(), Is.True); } else { Assert.That(nativeMembers[i].IsTypeOf <long>(), Is.True); } break; } case DateTimeConversionMethod.UnixEpoc: { Assert.That(nativeMembers[i].IsTypeOf <long>(), Is.True); break; } case DateTimeConversionMethod.Timestamp: { Assert.That(nativeMembers[i].IsTypeOf <MessagePackExtendedTypeObject>(), Is.True); var asExt = nativeMembers[i].AsMessagePackExtendedTypeObject(); Assert.That(asExt.TypeCode, Is.EqualTo(0xFF)); // Actual encoding should be tested in Timestamp tests. break; } } } // Test round trip buffer.Position = 0; var result = serializer.Unpack(buffer); switch (expected) { case DateTimeConversionMethod.Native: { Assert.That(result.Timestamp, Is.EqualTo(new Timestamp(now.UnixEpochSecondsPart, now.NanosecondsPart / 100 * 100))); Assert.That(result.DateTime, Is.EqualTo(now.ToDateTime().AddSeconds(1))); Assert.That(result.DateTimeOffset, Is.EqualTo(now.ToDateTimeOffset().AddSeconds(2))); #if (!SILVERLIGHT || WINDOWS_PHONE) && !XAMARIN && !UNITY && !UNITY Assert.That(result.FileTime, Is.EqualTo(now.Add(TimeSpan.FromSeconds(3).Subtract(TimeSpan.FromTicks(now.NanosecondsPart % 100))).ToDateTime().ToWin32FileTimeUtc())); #endif // ( !SILVERLIGHT || WINDOWS_PHONE ) && !XAMARIN && !UNITY && !UNITY break; } case DateTimeConversionMethod.UnixEpoc: { Assert.That(result.Timestamp, Is.EqualTo(new Timestamp(now.UnixEpochSecondsPart, now.NanosecondsPart / 1000000 * 1000000))); Assert.That(result.DateTime, Is.EqualTo(now.ToDateTime().AddSeconds(1).Subtract(TimeSpan.FromTicks(now.NanosecondsPart / 100 % 10000)))); Assert.That(result.DateTimeOffset, Is.EqualTo(now.ToDateTimeOffset().AddSeconds(2).Subtract(TimeSpan.FromTicks(now.NanosecondsPart / 100 % 10000)))); #if (!SILVERLIGHT || WINDOWS_PHONE) && !XAMARIN && !UNITY && !UNITY Assert.That(result.FileTime, Is.EqualTo(now.Add(TimeSpan.FromSeconds(3).Subtract(TimeSpan.FromTicks(now.NanosecondsPart / 100 % 10000))).ToDateTime().ToWin32FileTimeUtc())); #endif // ( !SILVERLIGHT || WINDOWS_PHONE ) && !XAMARIN && !UNITY && !UNITY break; } case DateTimeConversionMethod.Timestamp: { Assert.That(result.Timestamp, Is.EqualTo(now)); Assert.That(result.DateTime, Is.EqualTo(now.ToDateTime().AddSeconds(1))); Assert.That(result.DateTimeOffset, Is.EqualTo(now.ToDateTimeOffset().AddSeconds(2))); #if (!SILVERLIGHT || WINDOWS_PHONE) && !XAMARIN && !UNITY && !UNITY Assert.That(result.FileTime, Is.EqualTo(now.Add(TimeSpan.FromSeconds(3)).ToDateTime().ToWin32FileTimeUtc())); #endif // ( !SILVERLIGHT || WINDOWS_PHONE ) && !XAMARIN && !UNITY && !UNITY break; } } } }
public DateTimeOffsetMessagePackSerializer(SerializationContext ownerContext, DateTimeConversionMethod conversion) : base(ownerContext) { this._conversion = conversion; }
private static void TestDeserializationCore(DateTimeConversionMethod kind) { var now = Timestamp.UtcNow; var dateTimeNow = now.ToDateTimeOffset(); using (var buffer = new MemoryStream()) using (var packer = Packer.Create(buffer, PackerCompatibilityOptions.None)) { packer.PackArrayHeader(ClassHasTimestamp.MemberCount); for (var i = 0; i < ClassHasTimestamp.MemberCount; i++) { switch (kind) { case DateTimeConversionMethod.Native: { if (i == 2) { // DateTimeOffset -> [long, shourt] packer.PackArrayHeader(2); packer.Pack(dateTimeNow.AddSeconds(i).Ticks); packer.Pack(( short )0); } else { packer.Pack(dateTimeNow.AddSeconds(i).Ticks); } break; } case DateTimeConversionMethod.UnixEpoc: { packer.Pack(MessagePackConvert.FromDateTimeOffset(dateTimeNow.AddSeconds(i))); break; } case DateTimeConversionMethod.Timestamp: { packer.PackExtendedTypeValue((now.Add(TimeSpan.FromSeconds(i)).Encode())); break; } default: { Assert.Fail("Unexpected Kind"); break; } } } var context = new SerializationContext(); context.DefaultDateTimeConversionMethod = kind; var serializer = context.GetSerializer <ClassHasTimestamp>(); buffer.Position = 0; var result = serializer.Unpack(buffer); switch (kind) { case DateTimeConversionMethod.Native: { Assert.That(result.Timestamp, Is.EqualTo(new Timestamp(now.UnixEpochSecondsPart, now.NanosecondsPart / 100 * 100))); Assert.That(result.DateTime, Is.EqualTo(now.ToDateTime().AddSeconds(1))); Assert.That(result.DateTimeOffset, Is.EqualTo(now.ToDateTimeOffset().AddSeconds(2))); #if (!SILVERLIGHT || WINDOWS_PHONE) && !XAMARIN && !UNITY && !UNITY Assert.That(result.FileTime, Is.EqualTo(now.Add(TimeSpan.FromSeconds(3).Subtract(TimeSpan.FromTicks(now.NanosecondsPart % 100))).ToDateTime().ToWin32FileTimeUtc())); #endif // ( !SILVERLIGHT || WINDOWS_PHONE ) && !XAMARIN && !UNITY && !UNITY break; } case DateTimeConversionMethod.UnixEpoc: { Assert.That(result.Timestamp, Is.EqualTo(new Timestamp(now.UnixEpochSecondsPart, now.NanosecondsPart / 1000000 * 1000000))); Assert.That(result.DateTime, Is.EqualTo(now.ToDateTime().AddSeconds(1).Subtract(TimeSpan.FromTicks(now.NanosecondsPart / 100 % 10000)))); Assert.That(result.DateTimeOffset, Is.EqualTo(now.ToDateTimeOffset().AddSeconds(2).Subtract(TimeSpan.FromTicks(now.NanosecondsPart / 100 % 10000)))); #if (!SILVERLIGHT || WINDOWS_PHONE) && !XAMARIN && !UNITY && !UNITY Assert.That(result.FileTime, Is.EqualTo(now.Add(TimeSpan.FromSeconds(3).Subtract(TimeSpan.FromTicks(now.NanosecondsPart / 100 % 10000))).ToDateTime().ToWin32FileTimeUtc())); #endif // ( !SILVERLIGHT || WINDOWS_PHONE ) && !XAMARIN && !UNITY && !UNITY break; } case DateTimeConversionMethod.Timestamp: { Assert.That(result.Timestamp, Is.EqualTo(now)); Assert.That(result.DateTime, Is.EqualTo(now.ToDateTime().AddSeconds(1))); Assert.That(result.DateTimeOffset, Is.EqualTo(now.ToDateTimeOffset().AddSeconds(2))); #if (!SILVERLIGHT || WINDOWS_PHONE) && !XAMARIN && !UNITY && !UNITY Assert.That(result.FileTime, Is.EqualTo(now.Add(TimeSpan.FromSeconds(3)).ToDateTime().ToWin32FileTimeUtc())); #endif // ( !SILVERLIGHT || WINDOWS_PHONE ) && !XAMARIN && !UNITY && !UNITY break; } } } }
public DateTimeOffsetMessagePackSerializer(SerializationContext ownerContext, DateTimeConversionMethod conversion) : base(ownerContext, SerializerCapabilities.PackTo | SerializerCapabilities.UnpackFrom) { this._conversion = conversion; }