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));
        }
Ejemplo n.º 2
0
		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.
			}
		}