private ClassDefinition GetClassDefinition(object obj) { ClassDefinition classDefinition = null; if (obj is ASObject) { ASObject asObject = obj as ASObject; if (asObject.IsTypedObject) { classDefinitions.TryGetValue(asObject.TypeName, out classDefinition); } if (classDefinition != null) { return(classDefinition); } IObjectProxy proxy = ObjectProxyRegistry.GetObjectProxy(typeof(ASObject)); classDefinition = proxy.GetClassDefinition(obj); if (asObject.IsTypedObject) { //Only typed ASObject class definitions are cached. classDefinitions[asObject.TypeName] = classDefinition; } } else { string typeName = obj.GetType().FullName; if (!classDefinitions.TryGetValue(typeName, out classDefinition)) { IObjectProxy proxy = ObjectProxyRegistry.GetObjectProxy(obj.GetType()); classDefinition = proxy.GetClassDefinition(obj); classDefinitions[typeName] = classDefinition; } } return(classDefinition); }
public void WriteAMF3Object(object value) { if (!_objectReferences.ContainsKey(value)) { _objectReferences.Add(value, _objectReferences.Count); ClassDefinition classDefinition = GetClassDefinition(value); if (classDefinition == null) { Console.WriteLine("serializing:{0}", value.GetType().FullName); // DebugX.LogError("serializing:{0}", value.GetType().FullName); return; } if (_classDefinitionReferences.ContainsKey(classDefinition)) { //Existing class-def int handle = (int)_classDefinitionReferences[classDefinition];//handle = classRef 0 1 handle = handle << 2; handle = handle | 1; WriteAMF3IntegerData(handle); } else { //inline class-def //classDefinition = CreateClassDefinition(value); _classDefinitionReferences.Add(classDefinition, _classDefinitionReferences.Count); //handle = memberCount dynamic externalizable 1 1 int handle = classDefinition.MemberCount; handle = handle << 1; handle = handle | (classDefinition.IsDynamic ? 1 : 0); handle = handle << 1; handle = handle | (classDefinition.IsExternalizable ? 1 : 0); handle = handle << 2; handle = handle | 3; WriteAMF3IntegerData(handle); WriteAMF3UTF(classDefinition.ClassName); for (int i = 0; i < classDefinition.MemberCount; i++) { string key = classDefinition.Members[i].Name; WriteAMF3UTF(key); } } //write inline object if (classDefinition.IsExternalizable) { if (value is IExternalizable) { IExternalizable externalizable = value as IExternalizable; DataOutput dataOutput = new DataOutput(this); externalizable.WriteExternal(dataOutput); } else { throw new NotImplementedException(classDefinition.ClassName + " must is IExternalizable"); } } else { Type type = value.GetType(); IObjectProxy proxy = ObjectProxyRegistry.GetObjectProxy(type); for (int i = 0; i < classDefinition.MemberCount; i++) { object memberValue = proxy.GetValue(value, classDefinition.Members[i]); WriteAMF3Data(memberValue); } if (classDefinition.IsDynamic) { IDictionary dictionary = value as IDictionary; foreach (DictionaryEntry entry in dictionary) { WriteAMF3UTF(entry.Key.ToString()); WriteAMF3Data(entry.Value); } WriteAMF3UTF(string.Empty); } } } else { //handle = objectRef 0 int handle = (int)_objectReferences[value]; handle = handle << 1; WriteAMF3IntegerData(handle); } }