示例#1
0
 private void ReadObjectContent(BinaryReader reader, ObjectReader.TypeMetadata metadata, long objectId, out object objectInstance, out SerializationInfo info)
 {
     if (this._filterLevel == TypeFilterLevel.Low)
     {
         objectInstance = FormatterServices.GetSafeUninitializedObject(metadata.Type);
     }
     else
     {
         objectInstance = FormatterServices.GetUninitializedObject(metadata.Type);
     }
     this._manager.RaiseOnDeserializingEvent(objectInstance);
     info = ((!metadata.NeedsSerializationInfo) ? null : new SerializationInfo(metadata.Type, new FormatterConverter()));
     if (metadata.MemberNames != null)
     {
         for (int i = 0; i < metadata.FieldCount; i++)
         {
             this.ReadValue(reader, objectInstance, objectId, info, metadata.MemberTypes[i], metadata.MemberNames[i], null, null);
         }
     }
     else
     {
         for (int j = 0; j < metadata.FieldCount; j++)
         {
             this.ReadValue(reader, objectInstance, objectId, info, metadata.MemberTypes[j], metadata.MemberInfos[j].Name, metadata.MemberInfos[j], null);
         }
     }
 }
示例#2
0
        private void ReadRefTypeObjectInstance(BinaryReader reader, out long objectId, out object value, out SerializationInfo info)
        {
            objectId = (long)((ulong)reader.ReadUInt32());
            long   objectID = (long)((ulong)reader.ReadUInt32());
            object @object  = this._manager.GetObject(objectID);

            if (@object == null)
            {
                throw new SerializationException("Invalid binary format");
            }
            ObjectReader.TypeMetadata metadata = (ObjectReader.TypeMetadata) this._typeMetadataCache[@object.GetType()];
            this.ReadObjectContent(reader, metadata, objectId, out value, out info);
        }
示例#3
0
        private ObjectReader.TypeMetadata ReadTypeMetadata(BinaryReader reader, bool isRuntimeObject, bool hasTypeInfo)
        {
            ObjectReader.TypeMetadata typeMetadata = new ObjectReader.TypeMetadata();
            string text = reader.ReadString();
            int    num  = reader.ReadInt32();

            Type[]   array  = new Type[num];
            string[] array2 = new string[num];
            for (int i = 0; i < num; i++)
            {
                array2[i] = reader.ReadString();
            }
            if (hasTypeInfo)
            {
                TypeTag[] array3 = new TypeTag[num];
                for (int j = 0; j < num; j++)
                {
                    array3[j] = (TypeTag)reader.ReadByte();
                }
                for (int k = 0; k < num; k++)
                {
                    array[k] = this.ReadType(reader, array3[k]);
                }
            }
            if (!isRuntimeObject)
            {
                long assemblyId = (long)((ulong)reader.ReadUInt32());
                typeMetadata.Type = this.GetDeserializationType(assemblyId, text);
            }
            else
            {
                typeMetadata.Type = Type.GetType(text, true);
            }
            typeMetadata.MemberTypes = array;
            typeMetadata.MemberNames = array2;
            typeMetadata.FieldCount  = array2.Length;
            if (this._surrogateSelector != null)
            {
                ISurrogateSelector      surrogateSelector;
                ISerializationSurrogate surrogate = this._surrogateSelector.GetSurrogate(typeMetadata.Type, this._context, out surrogateSelector);
                typeMetadata.NeedsSerializationInfo = (surrogate != null);
            }
            if (!typeMetadata.NeedsSerializationInfo)
            {
                if (!typeMetadata.Type.IsSerializable)
                {
                    throw new SerializationException("Serializable objects must be marked with the Serializable attribute");
                }
                typeMetadata.NeedsSerializationInfo = typeof(ISerializable).IsAssignableFrom(typeMetadata.Type);
                if (!typeMetadata.NeedsSerializationInfo)
                {
                    typeMetadata.MemberInfos = new MemberInfo[num];
                    for (int l = 0; l < num; l++)
                    {
                        FieldInfo fieldInfo = null;
                        string    text2     = array2[l];
                        int       num2      = text2.IndexOf('+');
                        if (num2 != -1)
                        {
                            string b = array2[l].Substring(0, num2);
                            text2 = array2[l].Substring(num2 + 1);
                            for (Type baseType = typeMetadata.Type.BaseType; baseType != null; baseType = baseType.BaseType)
                            {
                                if (baseType.Name == b)
                                {
                                    fieldInfo = baseType.GetField(text2, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
                                    break;
                                }
                            }
                        }
                        else
                        {
                            fieldInfo = typeMetadata.Type.GetField(text2, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
                        }
                        if (fieldInfo == null)
                        {
                            throw new SerializationException("Field \"" + array2[l] + "\" not found in class " + typeMetadata.Type.FullName);
                        }
                        typeMetadata.MemberInfos[l] = fieldInfo;
                        if (!hasTypeInfo)
                        {
                            array[l] = fieldInfo.FieldType;
                        }
                    }
                    typeMetadata.MemberNames = null;
                }
            }
            if (!this._typeMetadataCache.ContainsKey(typeMetadata.Type))
            {
                this._typeMetadataCache[typeMetadata.Type] = typeMetadata;
            }
            return(typeMetadata);
        }
示例#4
0
 private void ReadObjectInstance(BinaryReader reader, bool isRuntimeObject, bool hasTypeInfo, out long objectId, out object value, out SerializationInfo info)
 {
     objectId = (long)((ulong)reader.ReadUInt32());
     ObjectReader.TypeMetadata metadata = this.ReadTypeMetadata(reader, isRuntimeObject, hasTypeInfo);
     this.ReadObjectContent(reader, metadata, objectId, out value, out info);
 }