protected internal override async Task <Version> UnpackFromAsyncCore(Unpacker unpacker, CancellationToken cancellationToken) { if (!unpacker.IsArrayHeader) { SerializationExceptions.ThrowInvalidArrayItemsCount(unpacker, typeof(Version), 4); } long length = unpacker.LastReadData.AsInt64(); if (length != 4) { SerializationExceptions.ThrowInvalidArrayItemsCount(unpacker, typeof(Version), 4); } var major = await unpacker.ReadInt32Async(cancellationToken).ConfigureAwait(false); if (!major.Success) { SerializationExceptions.ThrowMissingItem(0, unpacker); } var minor = await unpacker.ReadInt32Async(cancellationToken).ConfigureAwait(false); if (!minor.Success) { SerializationExceptions.ThrowMissingItem(1, unpacker); } var build = await unpacker.ReadInt32Async(cancellationToken).ConfigureAwait(false); if (!build.Success) { SerializationExceptions.ThrowMissingItem(2, unpacker); } var revision = await unpacker.ReadInt32Async(cancellationToken).ConfigureAwait(false); if (!revision.Success) { SerializationExceptions.ThrowMissingItem(3, unpacker); } if (build.Value < 0 && revision.Value < 0) { return(new Version(major.Value, minor.Value)); } else if (revision.Value < 0) { return(new Version(major.Value, minor.Value, build.Value)); } return(new Version(major.Value, minor.Value, build.Value, revision.Value)); }
public static async Task< Int32> UnpackInt32ValueAsync( Unpacker unpacker, Type objectType, String memberName, CancellationToken cancellationToken ) { if ( unpacker == null ) { SerializationExceptions.ThrowArgumentNullException( "unpacker" ); } if ( objectType == null ) { SerializationExceptions.ThrowArgumentNullException( "objectType" ); } if ( memberName == null ) { SerializationExceptions.ThrowArgumentNullException( "memberName" ); } #if ASSERT Contract.Assert( unpacker != null ); Contract.Assert( objectType != null ); Contract.Assert( memberName != null ); #endif // ASSERT // ReSharper disable once RedundantAssignment var ctx = default( UnpackerTraceContext ); InitializeUnpackerTrace( unpacker, ref ctx ); try { AsyncReadResult<Int32> result = await unpacker.ReadInt32Async( cancellationToken ).ConfigureAwait( false ); if ( !result.Success ) { SerializationExceptions.ThrowFailedToDeserializeMember( objectType, memberName, null ); } Trace( ctx, "ReadDirect", unpacker, memberName ); return result.Value; } catch ( MessageTypeException ex ) { SerializationExceptions.ThrowFailedToDeserializeMember( objectType, memberName, ex ); return default( Int32 ); // never reaches. } }