/// <summary>
        /// Reads the array.
        /// </summary>
        /// <param name="abstractHessianInput">HessianInput</param>
        /// <param name="intLength">Length of data</param>
        /// <param name="strType">Type of the array objects</param>
        /// <returns>Array data</returns>
        public Object ReadList(AbstractHessianInput abstractHessianInput, int intLength, string strType)
        {
            AbstractDeserializer abstractDeserializer = GetDeserializer(strType);

            if (abstractDeserializer != null)
            {
                return(abstractDeserializer.ReadList(abstractHessianInput, intLength));
            }
            else
            {
                return(new CCollectionDeserializer(typeof(List <Object>)).ReadList(
                           abstractHessianInput,
                           intLength));
            }
        }
Exemple #2
0
        /// <summary>
        /// Reads an arbitrary object from the input stream.
        /// </summary>
        /// <param name="expectedType">the expected class if the protocol doesn't supply it.</param>
        /// <returns>Read object</returns>
        /// <exception cref="CHessianException"/>
        /// <exception cref="CHessianException"/>
        public override object ReadObject(Type expectedType)
        {
            object objResult = null;

            if (expectedType == null || expectedType.Equals(typeof(object)))
            {
                objResult = ReadObject();
            }
            else
            {
                int intTag = Read();
                if (intTag != PROT_NULL)
                {
                    switch (intTag)
                    {
                    case PROT_MAP_TYPE:
                    {
                        string strType = ReadType();

                        AbstractDeserializer deserializer = GetObjectDeserializer(strType);

                        if (expectedType != deserializer.GetOwnType() && expectedType.IsAssignableFrom(deserializer.GetOwnType()))
                        {
                            return(deserializer.ReadMap(this));
                        }

                        deserializer = GetDeserializer(expectedType);


                        return(deserializer.ReadMap(this));
                    }

                    case PROT_REF_TYPE:
                    {
                        int intRefNumber = ParseInt();
                        return(m_arrRefs[intRefNumber]);
                    }

                    case 'r':
                    {
                        throw new CHessianException("remote type is not implemented");
                    }

                    case PROT_LIST_TYPE:
                    {
                        string strType   = this.ReadType();
                        int    intLength = this.ReadLength();
                        AbstractDeserializer deserializer = this.m_serializerFactory.GetObjectDeserializer(strType);
                        if (expectedType != deserializer.GetType() && expectedType.IsAssignableFrom(deserializer.GetType()))
                        {
                            //if (expectedType != deserializer.GetOwnType() && expectedType.IsAssignableFrom(deserializer.GetOwnType()))
                            return(deserializer.ReadList(this, intLength));
                        }
                        deserializer = m_serializerFactory.GetDeserializer(expectedType);
                        return(deserializer.ReadList(this, intLength));
                    }
                    }

                    m_intPeek = intTag;

                    objResult = m_serializerFactory.GetDeserializer(expectedType).ReadObject(this);
                }
            }
            return(objResult);
        }