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