public void ProcessReferenceType <T>(IWriteOnlyExactValueDescriptor <T> descriptor)
            where T : class
        {
            Type type;

            if (TryReadReferenceType(descriptor, out type))
            {
                // Do not create instance when predefined type, Just route to it.
                if (BinaryReaderWriterExtensions.IsPredefinedType(type))
                {
                    descriptor.Route(
                        new BinaryStateMember
                            (new MyCustomStateMember((IReflectionStateMember)descriptor.StateMember,
                                                     type),
                            true,
                            true),
                        descriptor.Owner,
                        true);

                    return;
                }

                T instance = (T)Activator.CreateInstance(type);
                _objects.Add(instance);
                descriptor.Set(instance);
                descriptor.Climb();
            }
        }
        public void ProcessArray <[IsArray] TArray>(IWriteOnlyExactValueDescriptor <TArray> descriptor)
            where TArray : class
        {
            // TODO: a bit too much code duplication here.
            Type type;

            if (TryReadReferenceType(descriptor, out type))
            {
                int[] lowerIndices = ReadIntArray();
                int[] lengths      = ReadIntArray();
                Type  elementType  = typeof(TArray).GetElementType();

                TArray value;

                if (type == elementType.MakeArrayType())
                {
                    // avoid T[*].
                    int length = lengths[0];

                    value =
                        (TArray)(object)
                        Array.CreateInstance(elementType, length);
                }
                else
                {
                    value =
                        (TArray)(object)Array.CreateInstance
                            (elementType,
                            lengths,
                            lowerIndices);
                }

                _objects.Add(value);

                descriptor.Set(value);

                descriptor.Climb();
            }
        }