Exemplo n.º 1
0
        /// <summary>
        /// Returns object reference for supplied metahandle
        /// </summary>
        public object HandleToReference(MetaHandle handle, TypeRegistry treg, SlimFormat format, SlimReader reader)
        {
            Debug.Assert(m_Mode == SerializationOperation.Deserializing, "HandleToReference() called while serializing", DebugAction.Throw);

            if (handle.IsInlinedString)
            {
                return(handle.Metadata.Value.StringValue);
            }
            if (handle.IsInlinedTypeValue)
            {
                var tref = treg[handle.Metadata.Value];//adding this type to registry if it is not there yet
                return(tref);
            }

            if (handle.IsInlinedRefType)
            {
                var tref = treg[handle.Metadata.Value];//adding this type to registry if it is not there yet
                var ra   = format.GetReadActionForRefType(tref);
                if (ra != null)
                {
                    var inst = ra(reader);
                    m_List.Add(inst);
                    return(inst);
                }
                else
                {
                    throw new SlimDeserializationException("Internal error HandleToReference: no read action for ref type, but ref mhandle is inlined");
                }
            }


            int idx = (int)handle.Handle;

            if (idx < m_List.Count)
            {
                return(m_List[idx]);
            }

            if (!handle.Metadata.HasValue)
            {
                throw new SlimDeserializationException(StringConsts.SLIM_HNDLTOREF_MISSING_TYPE_NAME_ERROR + handle.ToString());
            }

            Type type;
            var  metadata = handle.Metadata.Value;

            if (metadata.StringValue != null)               //need to search for possible array descriptor
            {
                var ip = metadata.StringValue.IndexOf('|'); //array descriptor start
                if (ip > 0)
                {
                    var tname = metadata.StringValue.Substring(0, ip);
                    if (TypeRegistry.IsNullHandle(tname))
                    {
                        return(null);
                    }
                    type = treg[tname];
                }
                else
                {
                    if (TypeRegistry.IsNullHandle(metadata))
                    {
                        return(null);
                    }
                    type = treg[metadata];
                }
            }
            else
            {
                if (TypeRegistry.IsNullHandle(metadata))
                {
                    return(null);
                }
                type = treg[metadata];
            }

            object instance = null;

            if (type.IsArray)
            {
                //DKh 20130712 Removed repetitive code that was refactored into Arrays class
                instance = Arrays.DescriptorToArray(metadata.StringValue, type);
            }
            else
            {
                //20130715 DKh
                instance = SerializationUtils.MakeNewObjectInstance(type);
            }

            m_List.Add(instance);
            return(instance);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Returns object reference for supplied metahandle
        /// </summary>
        public object HandleToReference(MetaHandle handle, TypeRegistry treg, SlimFormat format, SlimReader reader)
        {
            if (handle.IsInlinedString)
            {
                return(handle.Metadata);
            }
            if (handle.IsInlinedTypeValue)
            {
                var tref = treg.GetByHandle(handle.Metadata);//adding this type to registry if it is not there yet
                return(tref);
            }

            if (handle.IsInlinedRefType)
            {
                var tref = treg.GetByHandle(handle.Metadata);//adding this type to registry if it is not there yet
                var ra   = format.GetReadActionForRefType(tref);
                if (ra != null)
                {
                    var inst = ra(reader);
                    m_List.Add(inst);
                    m_Dict.Add(inst, m_List.Count - 1);
                    return(inst);
                }
                else
                {
                    throw new SlimDeserializationException("Internal error HandleToReference: no read action for ref type, but ref mhandle is inlined");
                }
            }


            int idx = (int)handle.Handle;

            if (idx < m_List.Count)
            {
                return(m_List[idx]);
            }

            if (string.IsNullOrEmpty(handle.Metadata))
            {
                throw new SlimDeserializationException(StringConsts.SLIM_HNDLTOREF_MISSING_TYPE_NAME_ERROR + handle.ToString());
            }

            var metadata = handle.Metadata;
            var ip       = metadata.IndexOf('|');
            //var segments = metadata.Split('|');
            var th = ip > 0 ? metadata.Substring(0, ip) : metadata;

            //20140701 DKh
            var type = treg[th];//segments[0]];

            object instance = null;

            if (type.IsArray)
            {
                //DKh 20130712 Removed repetitive code that was refactored into Arrays class
                instance = Arrays.DescriptorToArray(metadata, treg, type);
            }
            else
            {
                //20130715 DKh
                instance = SerializationUtils.MakeNewObjectInstance(type);
            }

            m_List.Add(instance);
            m_Dict.Add(instance, m_List.Count - 1);
            return(instance);
        }