{\r
ISurrogateSelector _surrogateSelector;\r
StreamingContext _context;\r
+ SerializationBinder _binder;\r
\r
ObjectManager _manager;\r
Hashtable _registeredAssemblies = new Hashtable();\r
public int NullCount;\r
}\r
\r
- public ObjectReader(ISurrogateSelector surrogateSelector, StreamingContext context)\r
+ public ObjectReader(ISurrogateSelector surrogateSelector, StreamingContext context, SerializationBinder binder)\r
{\r
_manager = new ObjectManager (surrogateSelector, context);\r
_surrogateSelector = surrogateSelector;\r
_context = context;\r
+ _binder = binder;\r
}\r
\r
- public object ReadObjectGraph (BinaryReader reader, bool readHeaders, HeaderHandler headerHandler)\r
+ public void ReadObjectGraph (BinaryReader reader, bool readHeaders, out object result, out Header[] headers)\r
{\r
- Header[] headers = null;\r
+ headers = null;\r
\r
// Reads the objects. The first object in the stream is the\r
// root object.\r
if (_rootObjectID == 0) _rootObjectID = _lastObjectID;\r
}\r
\r
- if (readHeaders && headerHandler != null)\r
- headerHandler (headers);\r
-\r
- return _manager.GetObject (_rootObjectID);\r
+ result = _manager.GetObject (_rootObjectID);\r
}\r
\r
public bool ReadNextObject (BinaryReader reader)\r
{\r
long id = (long) reader.ReadUInt32 ();\r
string assemblyName = reader.ReadString ();\r
- Assembly assembly = Assembly.Load (assemblyName);\r
- _registeredAssemblies [id] = assembly;\r
+ _registeredAssemblies [id] = assemblyName;\r
}\r
\r
private void ReadObjectInstance (BinaryReader reader, bool isRuntimeObject, out long objectId, out object value, out SerializationInfo info)\r
\r
private void RegisterObject (long objectId, object objectInstance, SerializationInfo info, long parentObjectId, MemberInfo parentObjectMemeber, int[] indices)\r
{\r
+ if (parentObjectId == 0) indices = null;\r
+\r
if (!objectInstance.GetType().IsValueType || parentObjectId == 0)\r
- _manager.RegisterObject (objectInstance, objectId, info, 0, null, indices);\r
+ _manager.RegisterObject (objectInstance, objectId, info, 0, null, null);\r
else\r
+ {\r
+ if (indices != null) indices = (int[])indices.Clone();\r
_manager.RegisterObject (objectInstance, objectId, info, parentObjectId, parentObjectMemeber, indices);\r
+ }\r
}\r
\r
private void ReadStringIntance (BinaryReader reader, out long objectId, out object value)\r
if (!isRuntimeObject) \r
{\r
long assemblyId = (long)reader.ReadUInt32();\r
- Assembly asm = (Assembly)_registeredAssemblies[assemblyId];\r
- metadata.Type = asm.GetType (className, true);\r
+ metadata.Type = GetDeserializationType (assemblyId, className);\r
}\r
else\r
metadata.Type = Type.GetType (className, true);\r
return members[0];\r
}\r
\r
+ private Type GetDeserializationType (long assemblyId, string className)\r
+ {\r
+ string assemblyName = (string)_registeredAssemblies[assemblyId];\r
+\r
+ if (_binder == null)\r
+ {\r
+ Assembly assembly = Assembly.Load (assemblyName);\r
+ return assembly.GetType (className, true);\r
+ }\r
+ else\r
+ return _binder.BindToType (assemblyName, className);\r
+ }\r
+\r
public Type ReadType (BinaryReader reader, TypeTag code)\r
{\r
switch (code)\r
{\r
string name = reader.ReadString ();\r
long asmid = (long) reader.ReadUInt32();\r
- Assembly asm = (Assembly)_registeredAssemblies[asmid];\r
- return asm.GetType (name, true);\r
+ return GetDeserializationType (asmid, name);\r
}\r
\r
case TypeTag.ArrayOfObject:\r