Exemplo n.º 1
0
 public static void RegisterSerializer(string aliasName, IAmf3Serializer serializer)
 {
     lock (sAliasToSerializer)
     {
         sAliasToSerializer[aliasName] = serializer;
     }
 }
Exemplo n.º 2
0
 // gets registered serializer associated with class alias
 public static IAmf3Serializer GetSerializerFromAlias(string aliasName)
 {
     lock (sAliasToSerializer)
     {
         IAmf3Serializer serializer = null;
         sAliasToSerializer.TryGetValue(aliasName, out serializer);
         return(serializer);
     }
 }
Exemplo n.º 3
0
        public void WriteDefaultObjectForType(Type type)
        {
            // get serializer
            IAmf3Serializer serializer = GetSerializerForType(type);
            // create default instance
            var defaultInstance = serializer.NewInstance(null);

            // write object using serializer
            serializer.WriteObject(this, defaultInstance);
        }
Exemplo n.º 4
0
        // gets serializer for a class alias string
        private IAmf3Serializer GetSerializerFromAlias(string alias)
        {
            IAmf3Serializer serializer = Amf3ClassDef.GetSerializerFromAlias(alias);

            if (serializer == null)
            {
                var type = Amf3ClassDef.GetTypeFromAlias(alias);
                if (type != null)
                {
                    // create reflection serializer
                    serializer = new ReflectionSerializer(alias, type, true, false);
                    // automatically register it
                    Amf3ClassDef.RegisterSerializer(alias, serializer);
                }
            }
            return(serializer);
        }
Exemplo n.º 5
0
        public object ReadVectorObject()
        {
            int num = ReadInteger();

            if ((num & 1) == 0)
            {
                return(GetTableEntry(objectTable, num >> 1));
            }

            num >>= 1;
            bool isFixed = ReadByte() != 0;

            // read object type name
            // this class definition is not known until the first object has been read, but we don't need it here
            string objectTypeName = ReadString();

            // get serializer for class alias
            IAmf3Serializer serializer = GetSerializerFromAlias(objectTypeName);

            IList vector;

            if (serializer != null)
            {
                // create vector using serializer
                vector = serializer.NewVector((uint)num, isFixed);
            }
            else
            {
                // create a new vector of dynamic
                vector = new _root.Vector <dynamic>((uint)num, isFixed);
            }

            objectTable.Add(vector);

            // read all values
            for (int i = 0; i < num; i++)
            {
                vector[i] = ReadNextObject();
            }

            return(vector);
        }
Exemplo n.º 6
0
        public Amf3Parser(byte[] data, int offset, int length, bool autoSetCapacity = true)
        {
            // set data source
            mData     = data;
            mPosition = offset;
            mLength   = length;

            // set default serializer
            if (UseExpandoAsDefault)
            {
                this.DefaultSerializer = new ExpandoSerializer();
            }
            else
            {
                this.DefaultSerializer = new Amf3Object.Serializer();
            }

            if (autoSetCapacity)
            {
                AutoSetCapacity();
            }
        }
Exemplo n.º 7
0
        public object ReadAmf3Object()
        {
            Amf3Object.Flags flags = (Amf3Object.Flags)ReadInteger();

            if ((flags & Amf3Object.Flags.Inline) == 0)
            {
                return(GetTableEntry(objectTable, ((int)flags) >> 1));
            }

            Amf3ClassDef classDef;

            if ((flags & Amf3Object.Flags.InlineClassDef) == 0)
            {
                classDef = GetTableEntry(traitTable, ((int)flags) >> 2);
            }
            else
            {
                classDef = ReadAmf3ClassDef(flags);
            }

            // get the serializer to use (start with the override serializer)
            IAmf3Serializer serializer = OverrideSerializer;

            if (serializer == null)
            {
                // no override? get serializer from class definition
                serializer = classDef.Serializer;
                if (serializer == null)
                {
                    // no serializer for class definition? use default serializer
                    serializer = DefaultSerializer;
                }
            }

            // fast path the Amf3Object serializer
            if (serializer is Amf3Object.Serializer)
            {
                var obj = new Amf3Object(classDef);

                // add to object table
                objectTable.Add(obj);

                // read all properties into object
                int count = classDef.Properties.Length;
                for (int i = 0; i < count; i++)
                {
                    ReadNextObject(ref obj.Values[i]);
                }

                // read dynamic properties
                if (classDef.Dynamic)
                {
                    string key = ReadString();
                    while (key != "")
                    {
                        var value = ReadNextObject();
                        obj.SetPropertyValueAsObject(key, value);
                        key = ReadString();
                    }
                }
                return(obj);
            }
            else
            {
                // create object instance using serializer
                object obj = serializer.NewInstance(classDef);

                // add to object table
                objectTable.Add(obj);

                // begin property remapping
                var reader = classDef.CreatePropertyReader();
                reader.BeginRead(this);
                // read object using serializer
                serializer.ReadObject(reader, obj);
                // end property remapping
                classDef.ReleasePropertyReader(reader);

                // read dynamic properties
                if (classDef.Dynamic)
                {
                    var    dc  = obj as PlayScript.IDynamicClass;
                    string key = ReadString();
                    while (key != "")
                    {
                        var value = ReadNextObject();
                        if (dc != null)
                        {
                            dc.__SetDynamicValue(key, value);
                        }
                        key = ReadString();
                    }
                }
                return(obj);
            }
        }
Exemplo n.º 8
0
        public void Write(object obj)
        {
            if (obj == null)
            {
                Write(Amf3TypeCode.Null);
                return;
            }

            var serializable = obj as IAmf3Writable;

            if (serializable != null)
            {
                serializable.Serialize(this);
                return;
            }

            var str = obj as string;

            if (str != null)
            {
                Write(str);
                return;
            }

            var expando = obj as ExpandoObject;

            if (expando != null)
            {
                Write(expando);
                return;
            }

            if (obj is bool)
            {
                Write((bool)obj);
                return;
            }

            if (obj is double)
            {
                Write((double)obj);
                return;
            }

            if (obj is float)
            {
                Write((double)(float)obj);
                return;
            }

            if (obj is int)
            {
                Write((int)obj);
                return;
            }

            if (obj is uint)
            {
                Write((int)(uint)obj);
                return;
            }

            if (obj is _root.Date)
            {
                Write((_root.Date)obj);
                return;
            }

            if (obj is IList)
            {
                Write((IList)obj);
                return;
            }

            if (obj is flash.utils.ByteArray)
            {
                Write((flash.utils.ByteArray)obj);
                return;
            }

            if (obj is flash.utils.Dictionary)
            {
                Write((flash.utils.Dictionary)obj);
                return;
            }

            if (obj is byte ||
                obj is sbyte ||
                obj is short ||
                obj is ushort)
            {
                Write(Convert.ToInt32(obj));
                return;
            }

            // get serializer from type
            var             type       = obj.GetType();
            IAmf3Serializer serializer = GetSerializerForType(type);

            // write object using serializer
            serializer.WriteObject(this, obj);
        }