* MessageFormatter.cs: In the all-are-primitive case, serialize Args,
[mono.git] / mcs / class / corlib / System.Runtime.Serialization.Formatters.Binary / ObjectReader.cs
index 262cd10a5f792f0eae5295843d223464dbd08558..c703c04e1814564a9ba247941e5dd37eabd063ae 100644 (file)
@@ -6,14 +6,13 @@
 //\r
 // (C) 2003 Lluis Sanchez Gual\r
 \r
-// FIXME: Implement the missing binary elements\r
-\r
 using System;\r
 using System.Runtime.Serialization;\r
 using System.IO;\r
 using System.Collections;\r
 using System.Reflection;\r
 using System.Runtime.Remoting.Messaging;\r
+using System.Globalization;\r
 \r
 namespace System.Runtime.Serialization.Formatters.Binary\r
 {\r
@@ -420,9 +419,28 @@ namespace System.Runtime.Serialization.Formatters.Binary
                                        metadata.MemberInfos = new MemberInfo [fieldCount];\r
                                        for (int n=0; n<fieldCount; n++)\r
                                        {\r
-                                               MemberInfo[] members = metadata.Type.GetMember (names[n], MemberTypes.Field | MemberTypes.Property, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);\r
+                                               MemberInfo[] members = null;\r
+                                               string memberName = names[n];\r
+                                               \r
+                                               int i = memberName.IndexOf ('+');\r
+                                               if (i != -1) {\r
+                                                       string baseTypeName = names[n].Substring (0,i);\r
+                                                       memberName = names[n].Substring (i+1);\r
+                                                       Type t = metadata.Type.BaseType;\r
+                                                       while (t != null) {\r
+                                                               if (t.Name == baseTypeName) {\r
+                                                                       members = t.GetMember (memberName, MemberTypes.Field | MemberTypes.Property, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);\r
+                                                                       break;\r
+                                                               }\r
+                                                               else\r
+                                                                       t = t.BaseType;\r
+                                                       }\r
+                                               }\r
+                                               else\r
+                                                       members = metadata.Type.GetMember (memberName, MemberTypes.Field | MemberTypes.Property, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);\r
+                                                       \r
+                                               if (members == null || members.Length == 0) throw new SerializationException ("Field \"" + names[n] + "\" not found in class " + metadata.Type.FullName);\r
                                                if (members.Length > 1) throw new SerializationException ("There are two public members named \"" + names[n] + "\" in the class hirearchy of " + metadata.Type.FullName);\r
-                                               if (members.Length == 0) throw new SerializationException ("Field \"" + names[n] + "\" not found in class " + metadata.Type.FullName);\r
                                                metadata.MemberInfos [n] = members[0];\r
                                        }\r
                                        metadata.MemberNames = null;    // Info now in MemberInfos\r
@@ -621,7 +639,7 @@ namespace System.Runtime.Serialization.Formatters.Binary
                                        return new DateTime (reader.ReadInt64());\r
 \r
                                case TypeCode.Decimal:\r
-                                       return reader.ReadDecimal();\r
+                                       return Decimal.Parse (reader.ReadString(), CultureInfo.InvariantCulture);\r
 \r
                                case TypeCode.Double:\r
                                        return reader.ReadDouble();\r