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); } }
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)); } }
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); } }