* ObjectReader.cs: Changed signature of ReadObjectGraph, so now it returns the
[mono.git] / mcs / class / corlib / System.Runtime.Serialization.Formatters.Binary / ObjectReader.cs
index 5ab0edda6267ae8199d9fbe45c48a0b7b28f4bdd..6f065f92170f9d6ea8a081c8043d9b4c0c073699 100644 (file)
@@ -21,6 +21,7 @@ namespace System.Runtime.Serialization.Formatters.Binary
        {\r
                ISurrogateSelector _surrogateSelector;\r
                StreamingContext _context;\r
+               SerializationBinder _binder;\r
 \r
                ObjectManager _manager;\r
                Hashtable _registeredAssemblies = new Hashtable();\r
@@ -45,16 +46,17 @@ namespace System.Runtime.Serialization.Formatters.Binary
                        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
@@ -67,10 +69,7 @@ namespace System.Runtime.Serialization.Formatters.Binary
                                        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
@@ -185,8 +184,7 @@ namespace System.Runtime.Serialization.Formatters.Binary
                {\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
@@ -222,10 +220,15 @@ namespace System.Runtime.Serialization.Formatters.Binary
 \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
@@ -360,8 +363,7 @@ namespace System.Runtime.Serialization.Formatters.Binary
                        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
@@ -520,6 +522,19 @@ namespace System.Runtime.Serialization.Formatters.Binary
                        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
@@ -543,8 +558,7 @@ namespace System.Runtime.Serialization.Formatters.Binary
                                {\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