In .:
authorRobert Jordan <robertj@gmx.net>
Thu, 23 Aug 2007 18:40:17 +0000 (18:40 -0000)
committerRobert Jordan <robertj@gmx.net>
Thu, 23 Aug 2007 18:40:17 +0000 (18:40 -0000)
2007-08-23  Robert Jordan  <robertj@gmx.net>

* corlib.dll.sources: Added MemberInfoSerializationHolder.cs.

In System.Runtime.Serialization.Formatters.Binary:
2007-08-23  Robert Jordan  <robertj@gmx.net>

* ObjectReader.cs, ObjectReader.cs: Map between System.MonoType[] and
MS.NET's System.RuntimeType[].

* ObjectReader.cs (ReadType): When a type couldn't be found, emit
a more useful exception.

In System.Reflection:
2007-08-23  Robert Jordan  <robertj@gmx.net>

* MemberInfoSerializationHolder.cs: created from
ReflectionSerializationHolder to match MS (fixes bug #80761).
Add support for fields, events, properties and generic methods.

* MonoMethod.cs (GetObjectData): handle generic arguments.

* MonoGenericMethod.cs: mark as [Serializable].

* MonoProperty.cs (GetObjectData): implemented.

* MonoField.cs: ditto.

* MonoEvent.cs: ditto.

svn path=/trunk/mcs/; revision=84732

13 files changed:
mcs/class/corlib/ChangeLog
mcs/class/corlib/System.Reflection/ChangeLog
mcs/class/corlib/System.Reflection/MemberInfoSerializationHolder.cs [new file with mode: 0644]
mcs/class/corlib/System.Reflection/MonoEvent.cs
mcs/class/corlib/System.Reflection/MonoField.cs
mcs/class/corlib/System.Reflection/MonoGenericMethod.cs
mcs/class/corlib/System.Reflection/MonoMethod.cs
mcs/class/corlib/System.Reflection/MonoProperty.cs
mcs/class/corlib/System.Reflection/ReflectionSerializationHolder.cs
mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ChangeLog
mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs
mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectWriter.cs
mcs/class/corlib/corlib.dll.sources

index b168c3847ee71fbb836a31dbdc9976faa20ff2d0..3d63388a89b263c921e5412386bc5d7e11c233cc 100644 (file)
@@ -1,3 +1,7 @@
+2007-08-23  Robert Jordan  <robertj@gmx.net>
+
+       * corlib.dll.sources: Added MemberInfoSerializationHolder.cs.
+
 2007-08-22  Atsushi Enomoto  <atsushi@ximian.com>
 
        * corlib_test.dll.sources : added ChannelServicesTest.cs.
index 343053930b670fea89b4780f046ffacf88e567ac..31a88130ad53daca863efaa818248a31db04752b 100644 (file)
@@ -1,3 +1,19 @@
+2007-08-23  Robert Jordan  <robertj@gmx.net>
+
+       * MemberInfoSerializationHolder.cs: created from
+       ReflectionSerializationHolder to match MS (fixes bug #80761).
+       Add support for fields, events, properties and generic methods.
+
+       * MonoMethod.cs (GetObjectData): handle generic arguments.
+
+       * MonoGenericMethod.cs: mark as [Serializable].
+
+       * MonoProperty.cs (GetObjectData): implemented.
+
+       * MonoField.cs: ditto.
+
+       * MonoEvent.cs: ditto.
+
 2007-07-19  Atsushi Enomoto  <atsushi@ximian.com>
 
        * MonoMethod.cs : parameter types should be fixed as well.
diff --git a/mcs/class/corlib/System.Reflection/MemberInfoSerializationHolder.cs b/mcs/class/corlib/System.Reflection/MemberInfoSerializationHolder.cs
new file mode 100644 (file)
index 0000000..189d033
--- /dev/null
@@ -0,0 +1,173 @@
+// MemberInfoSerializationHolder.cs.cs
+//
+// Author:
+//  Patrik Torstensson
+//  Robert Jordan <robertj@gmx.net>
+//
+// (C) 2003 Patrik Torstensson
+
+//
+// Copyright (C) 2004-2007 Novell, Inc (http://www.novell.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Runtime.Serialization;
+
+namespace System.Reflection
+{
+       [Serializable]
+       internal class MemberInfoSerializationHolder : IObjectReference, ISerializable
+       {
+               const BindingFlags DefaultBinding = BindingFlags.Instance | BindingFlags.Static |
+                       BindingFlags.Public | BindingFlags.NonPublic;
+
+               readonly string         _memberName;
+               readonly string         _memberSignature;
+               readonly MemberTypes    _memberType;
+               readonly Type           _reflectedType;
+#if NET_2_0
+               readonly Type[]          _genericArguments;
+#endif
+               MemberInfoSerializationHolder(SerializationInfo info, StreamingContext ctx)
+               {
+                       string assemblyName;
+                       string typeName;
+
+                       assemblyName = info.GetString("AssemblyName");
+                       typeName = info.GetString("ClassName");
+
+                       _memberName = info.GetString("Name");
+                       _memberSignature = info.GetString("Signature");
+                       _memberType = (MemberTypes) info.GetInt32("MemberType");
+
+#if NET_2_0
+                       try {
+                               _genericArguments = null;
+
+                               // FIXME: this doesn't work at present. It seems that
+                               // ObjectManager doesn't cope with nested IObjectReferences.
+                               // _genericArguments = (Type[]) info.GetValue("GenericArguments", typeof(Type[]));
+                       } catch (SerializationException) {
+                               // expected (old NET_1_0 protocol)
+                       }
+#endif
+                       // Load type
+                       Assembly asm = Assembly.Load(assemblyName);
+
+                       _reflectedType = asm.GetType(typeName, true, true);
+               }
+
+               public static void Serialize(SerializationInfo info, String name, Type klass, String signature, MemberTypes type)
+               {
+                       Serialize (info, name, klass, signature, type, null);
+               }
+
+#if NET_2_0
+               public
+#endif
+               static void Serialize(SerializationInfo info, String name, Type klass, String signature, MemberTypes type, Type[] genericArguments)
+               {
+                       info.SetType( typeof(MemberInfoSerializationHolder));
+
+                       info.AddValue("AssemblyName", klass.Module.Assembly.FullName, typeof(String));
+                       info.AddValue("ClassName", klass.FullName, typeof(String));
+
+                       info.AddValue("Name", name, typeof(String));
+                       info.AddValue("Signature", signature, typeof(String));
+                       info.AddValue("MemberType",(int)type);
+#if NET_2_0
+                       info.AddValue("GenericArguments", genericArguments, typeof (Type[]));
+#endif
+               }
+
+               public void GetObjectData(SerializationInfo info, StreamingContext context)
+               {
+                       throw new NotSupportedException();
+               }
+
+               public object GetRealObject(StreamingContext context)
+               {
+                       switch (_memberType) 
+                       {
+                               case MemberTypes.Constructor:
+                                       ConstructorInfo [] ctors;
+
+                                       ctors = _reflectedType.GetConstructors (DefaultBinding);
+                                       for (int i = 0; i < ctors.Length; i++) 
+                                               if ( ctors[i].ToString().Equals(_memberSignature)) 
+                                                       return ctors[i];
+
+                                       throw new SerializationException (String.Format ("Could not find constructor '{0}' in type '{1}'", _memberSignature, _reflectedType));
+
+                               case MemberTypes.Method:
+                                       MethodInfo [] methods;
+
+                                       methods = _reflectedType.GetMethods(DefaultBinding);
+                                       for (int i = 0; i < methods.Length; i++) 
+                                               if ((methods[i]).ToString().Equals(_memberSignature)) 
+                                                       return methods[i];
+#if NET_2_0
+                                               else if (_genericArguments != null &&
+                                                       methods[i].IsGenericMethod &&
+                                                       methods[i].GetGenericArguments().Length == _genericArguments.Length) {
+
+                                                       MethodInfo mi = methods[i].MakeGenericMethod(_genericArguments);
+
+                                                       if (mi.ToString() == _memberSignature)
+                                                               return mi;
+                                               }
+#endif
+
+                                       throw new SerializationException (String.Format ("Could not find method '{0}' in type '{1}'", _memberSignature, _reflectedType));
+
+                               case MemberTypes.Field:
+                                       FieldInfo fi = _reflectedType.GetField (_memberName, DefaultBinding);
+
+                                       if (fi != null)
+                                               return fi;
+
+                                       throw new SerializationException (String.Format ("Could not find field '{0}' in type '{1}'", _memberName, _reflectedType));
+
+                               case MemberTypes.Property:
+                                       PropertyInfo pi = _reflectedType.GetProperty (_memberName, DefaultBinding);
+
+                                       if (pi != null)
+                                               return pi;
+
+                                       throw new SerializationException (String.Format ("Could not find property '{0}' in type '{1}'", _memberName, _reflectedType));
+
+#if NET_2_0
+                               case MemberTypes.Event:
+                                       EventInfo ei = _reflectedType.GetEvent (_memberName, DefaultBinding);
+
+                                       if (ei != null)
+                                               return ei;
+
+                                       throw new SerializationException (String.Format ("Could not find event '{0}' in type '{1}'", _memberName, _reflectedType));
+#endif
+
+                               default:
+                                       throw new SerializationException (String.Format ("Unhandled MemberType {0}",  _memberType));
+                       }
+               }
+       }
+}
index 9ddc79b4adb15efced067ae442851e3bce6b6905..6b84ea7da858a38c2f1efcef6d8a6de44fd17bbf 100644 (file)
@@ -34,6 +34,7 @@ using System;
 using System.Reflection;
 using System.Runtime.CompilerServices;
 using System.Runtime.InteropServices;
+using System.Runtime.Serialization;
 
 namespace System.Reflection {
 
@@ -51,7 +52,13 @@ namespace System.Reflection {
                internal static extern void get_event_info (MonoEvent ev, out MonoEventInfo info);
        }
 
-       internal sealed class MonoEvent: EventInfo {
+#if NET_2_0
+       [Serializable]
+       internal sealed class MonoEvent: EventInfo, ISerializable
+#else
+       internal sealed class MonoEvent: EventInfo
+#endif
+       {
                IntPtr klass;
                IntPtr handle;
 
@@ -163,5 +170,13 @@ namespace System.Reflection {
                        return MonoCustomAttrs.GetCustomAttributes (this, attributeType, inherit);
                }
 
+#if NET_2_0
+               // ISerializable
+               public void GetObjectData (SerializationInfo info, StreamingContext context) 
+               {
+                       MemberInfoSerializationHolder.Serialize (info, Name, ReflectedType,
+                               ToString(), MemberTypes.Event);
+               }
+#endif
        }
 }
index 48247af850251151e837a4b4c50c320b4ddefa2c..997ceaef7a6e3aa0ecd4f70b88c04dd3cba29a57 100644 (file)
@@ -36,10 +36,12 @@ using System;
 using System.Globalization;
 using System.Runtime.CompilerServices;
 using System.Runtime.InteropServices;
+using System.Runtime.Serialization;
 
 namespace System.Reflection {
-       
-       internal class MonoField : FieldInfo {
+
+       [Serializable]
+       internal class MonoField : FieldInfo, ISerializable {
                internal IntPtr klass;
                internal RuntimeFieldHandle fhandle;
                string name;
@@ -141,5 +143,12 @@ namespace System.Reflection {
                        field.fhandle = fhandle;
                        return field;
                }
+
+               // ISerializable
+               public void GetObjectData (SerializationInfo info, StreamingContext context) 
+               {
+                       MemberInfoSerializationHolder.Serialize (info, Name, ReflectedType,
+                               ToString(), MemberTypes.Field);
+               }
        }
 }
index ba91c0e954bdbcc1eefc5b0f717285945bd823e8..348b304d080edaf15bde35b0890802feacb4f494 100644 (file)
@@ -35,6 +35,7 @@ using System.Runtime.CompilerServices;
 
 namespace System.Reflection
 {
+       [Serializable]
        internal class MonoGenericMethod : MonoMethod
        {
                internal MonoGenericMethod ()
@@ -49,6 +50,7 @@ namespace System.Reflection
                }
        }
 
+       [Serializable]
        internal class MonoGenericCMethod : MonoCMethod
        {
                internal MonoGenericCMethod ()
index baccea2875bfbe03aed4f04ecc76c4b1854af0fe..754831b03938fc3f01e8b338d4002d3042dc5eab 100644 (file)
@@ -282,7 +282,13 @@ namespace System.Reflection {
                // ISerializable
                public void GetObjectData(SerializationInfo info, StreamingContext context) 
                {
-                       ReflectionSerializationHolder.Serialize ( info, Name, ReflectedType, ToString(), MemberTypes.Method);
+#if NET_2_0
+                       Type[] genericArguments = IsGenericMethod && !IsGenericMethodDefinition
+                               ? GetGenericArguments () : null;
+                       MemberInfoSerializationHolder.Serialize ( info, Name, ReflectedType, ToString(), MemberTypes.Method, genericArguments);
+#else
+                       MemberInfoSerializationHolder.Serialize ( info, Name, ReflectedType, ToString(), MemberTypes.Method);
+#endif
                }
 
 #if NET_2_0 || BOOTSTRAP_NET_2_0
@@ -469,7 +475,7 @@ namespace System.Reflection {
                // ISerializable
                public void GetObjectData(SerializationInfo info, StreamingContext context) 
                {
-                       ReflectionSerializationHolder.Serialize ( info, Name, ReflectedType, ToString(), MemberTypes.Constructor);
+                       MemberInfoSerializationHolder.Serialize ( info, Name, ReflectedType, ToString(), MemberTypes.Constructor);
                }
        }
 }
index 18ea702bcbb90cadd49ef61d85011354907f83c9..b12f031baa90e4f95c42e00bc46c05edeea78d2d 100644 (file)
@@ -32,6 +32,7 @@
 using System.Globalization;
 using System.Runtime.CompilerServices;
 using System.Runtime.InteropServices;
+using System.Runtime.Serialization;
 using System.Security;
 
 namespace System.Reflection {
@@ -62,7 +63,9 @@ namespace System.Reflection {
                Name = 1 << 5
                
        }
-       internal class MonoProperty : PropertyInfo {
+
+       [Serializable]
+       internal class MonoProperty : PropertyInfo, ISerializable {
                internal IntPtr klass;
                internal IntPtr prop;
                MonoPropertyInfo info;
@@ -267,6 +270,11 @@ namespace System.Reflection {
                }
 #endif
 
+               // ISerializable
+               public void GetObjectData (SerializationInfo info, StreamingContext context) 
+               {
+                       MemberInfoSerializationHolder.Serialize (info, Name, ReflectedType,
+                               ToString(), MemberTypes.Property);
+               }
        }
 }
-
index 821e12b4e69d04f04ec3641145fac2ba3472fd60..033f3dab6c958f12eb07bbd57c0b70a737af5315 100644 (file)
@@ -1,4 +1,7 @@
-// ReflectionSerializationHolder.cs.cs\r
+// ReflectionSerializationHolder.cs\r
+//\r
+// Note: this class was superseded by MemberInfoSerializationHolder but\r
+// it's still included in the build to provide backwards compatibility.\r
 //\r
 // Author:\r
 //  Patrik Torstensson\r
index e2e29eee87b5f117787f48a3e95d6b9de840ac39..68502e1ab07c478d21ebd1c9d3ed1fef1e1c98c4 100644 (file)
@@ -1,3 +1,11 @@
+2007-08-23  Robert Jordan  <robertj@gmx.net>
+
+       * ObjectReader.cs, ObjectReader.cs: Map between System.MonoType[] and
+       MS.NET's System.RuntimeType[].
+       
+       * ObjectReader.cs (ReadType): When a type couldn't be found, emit
+       a more useful exception.
+
 2007-05-03  Dick Porter  <dick@ximian.com>
 
        * BinaryFormatter.cs: Update to 2.0 profile
index e7d1e93e16d65de2fe34b5f74553743572478cc7..cacefd448b8500fb6d354c75a7931dc786455b3a 100644 (file)
@@ -834,9 +834,15 @@ namespace System.Runtime.Serialization.Formatters.Binary
                                        // map MS.NET's System.RuntimeType to System.MonoType
                                        if (_context.State == StreamingContextStates.Remoting)
                                                if (name == "System.RuntimeType")
-                                                       name = "System.MonoType";
+                                                       return typeof (MonoType);
+                                               else if (name == "System.RuntimeType[]")
+                                                       return typeof (MonoType[]);
 #endif
-                                       return Type.GetType (name, true);
+                                       Type t = Type.GetType (name);
+                                       if (t != null)
+                                               return t;
+
+                                       throw new SerializationException (String.Format ("Could not find type '{0}'.", name));
                                }
 
                                case TypeTag.GenericType:
index df360c920e02dcc01df3bd00aa213f6b73248728..d1450e3c364cbaa437fc09f2930100a11ef1a806 100644 (file)
@@ -958,6 +958,8 @@ namespace System.Runtime.Serialization.Formatters.Binary
                                        if (_context.State == StreamingContextStates.Remoting)
                                                if (type == typeof (System.MonoType))
                                                        fullName =  "System.RuntimeType";
+                                               else if (type == typeof (System.MonoType[]))
+                                                       fullName =  "System.RuntimeType[]";
 #endif
                                        writer.Write (fullName);
                                        break;
index 453052d4c8d2e3d59a3de71de7a56387d07ef1fe..4ca3a6ec3d026def504853624d5adf9a5e1bb236 100644 (file)
@@ -454,6 +454,7 @@ System.Reflection/LocalVariableInfo.cs
 System.Reflection/ManifestResourceInfo.cs
 System.Reflection/MemberFilter.cs
 System.Reflection/MemberInfo.cs
+System.Reflection/MemberInfoSerializationHolder.cs
 System.Reflection/MemberTypes.cs
 System.Reflection/MethodAttributes.cs
 System.Reflection/MethodBase.cs