{\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
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