예제 #1
0
        public Array ReadAMF3ObjectArray()
        {
            int  handle = ReadAMF3IntegerData();
            bool inline = ((handle & 1) != 0); handle = handle >> 1;

            if (inline)
            {
                //List<object> list = new List<object>(handle);
                //int @fixed = ReadAMF3IntegerData();
                string typeIdentifier = ReadAMF3String();
                Array  list;
                if (!string.Empty.Equals(typeIdentifier))
                {
                    Type dstElementType = ObjectFactory.Locate(typeIdentifier);
                    list = Array.CreateInstance(dstElementType, handle);
                }
                else
                {
                    list = new object[handle];
                }
                AddAMF3ObjectReference(list);
                for (int i = 0; i < handle; i++)
                {
                    byte   typeCode = this.ReadByte();
                    object obj      = ReadAMF3Data(typeCode);
                    list.SetValue(obj, i);
                }
                //if (@fixed == 1)
                //return list.GetType().GetMethod("AsReadOnly").Invoke(list, null) as IList;

                return(list);
            }
            else
            {
                return(ReadAMF3ObjectReference(handle) as Array);
            }
        }
예제 #2
0
        public object ReadAMF3ObjectVector()
        {
            int  handle = ReadAMF3IntegerData();
            bool inline = ((handle & 1) != 0); handle = handle >> 1;

            if (inline)
            {
                //List<object> list = new List<object>(handle);
                int    @fixed         = ReadAMF3IntegerData();
                string typeIdentifier = ReadAMF3String();

                Type type = null;
                if (!string.Empty.Equals(typeIdentifier))
                {
                    type = ObjectFactory.Locate(typeIdentifier);
                }
                IList list;
                if (@fixed == 1)
                {
                    if (type != null)
                    {
                        list = Array.CreateInstance(ObjectFactory.Locate(typeIdentifier), handle);
                    }
                    else
                    {
                        type = typeof(object);
                        list = new object[handle];
                    }
                    AddAMF3ObjectReference(list);
                    for (int i = 0; i < handle; i++)
                    {
                        byte   typeCode = this.ReadByte();
                        object obj      = ReadAMF3Data(typeCode);
                        list[i] = Convert.ChangeType(obj, type);;
                    }
                    return(list);
                }
                else
                {
                    if (type != null)
                    {
                        list = ReflectionUtils.CreateGeneric(typeof(List <>), ObjectFactory.Locate(typeIdentifier)) as IList;
                    }
                    else
                    {
                        type = typeof(object);
                        list = new List <object>();
                    }
                    AddAMF3ObjectReference(list);

                    for (int i = 0; i < handle; i++)
                    {
                        byte   typeCode = this.ReadByte();
                        object obj      = ReadAMF3Data(typeCode);
                        obj = Convert.ChangeType(obj, type);
                        list.Add(obj);
                    }
                    return(list);
                }
            }
            else
            {
                return(ReadAMF3ObjectReference(handle));
            }
        }
예제 #3
0
        public object ReadData(AMFReader reader)
        {
            int  handle = reader.ReadAMF3IntegerData();
            bool inline = ((handle & 1) != 0); handle = handle >> 1;

            if (!inline)
            {
                //An object reference
                return(reader.ReadAMF3ObjectReference(handle));
            }
            else
            {
                ClassDefinition      classDefinition     = reader.ReadClassDefinition(handle);
                object               instance            = null;
                IReflectionOptimizer reflectionOptimizer = _optimizedReaders[classDefinition.ClassName] as IReflectionOptimizer;
                if (reflectionOptimizer == null)
                {
                    lock (_optimizedReaders)
                    {
                        if (classDefinition.IsTypedObject)
                        {
                            if (!_optimizedReaders.Contains(classDefinition.ClassName))
                            {
                                //Temporary reader
                                _optimizedReaders[classDefinition.ClassName] = new AMF3TempObjectReader();
                                Type type = ObjectFactory.Locate(classDefinition.ClassName);
                                if (type != null)
                                {
                                    instance = ObjectFactory.CreateInstance(type);
                                    if (classDefinition.IsExternalizable)
                                    {
                                        reflectionOptimizer = new AMF3ExternalizableReader();
                                        _optimizedReaders[classDefinition.ClassName] = reflectionOptimizer;
                                        instance = reflectionOptimizer.ReadData(reader, classDefinition);
                                    }
                                    else
                                    {
                                        reader.AddAMF3ObjectReference(instance);
                                    }
                                }
                                else
                                {
                                    reflectionOptimizer = new AMF3TypedASObjectReader(classDefinition.ClassName);
                                    _optimizedReaders[classDefinition.ClassName] = reflectionOptimizer;
                                    instance = reflectionOptimizer.ReadData(reader, classDefinition);
                                }
                            }
                            else
                            {
                                reflectionOptimizer = _optimizedReaders[classDefinition.ClassName] as IReflectionOptimizer;
                                instance            = reflectionOptimizer.ReadData(reader, classDefinition);
                            }
                        }
                        else
                        {
                            reflectionOptimizer = new AMF3TypedASObjectReader(classDefinition.ClassName);
                            _optimizedReaders[classDefinition.ClassName] = reflectionOptimizer;
                            instance = reflectionOptimizer.ReadData(reader, classDefinition);
                        }
                    }
                }
                else
                {
                    instance = reflectionOptimizer.ReadData(reader, classDefinition);
                }
                return(instance);
            }
        }