2004-05-29 Gonzalo Paniagua Javier <gonzalo@ximian.com>
[mono.git] / mcs / class / corlib / System.Runtime.Serialization.Formatters.Binary / ObjectWriter.cs
index 1a2538f9172b4d81f914b6ae32cc1aec2af1f586..bb0a24ed6e589a514018d3a49ba8f3ff3bc35d3b 100644 (file)
@@ -5,14 +5,13 @@
 //\r
 // (C) 2003 Lluis Sanchez Gual\r
 \r
-// FIXME: Implement the missing binary elements\r
-\r
 using System;\r
 using System.IO;\r
 using System.Collections;\r
 using System.Runtime.Serialization;\r
 using System.Runtime.Remoting.Messaging;\r
 using System.Reflection;\r
+using System.Globalization;\r
 \r
 namespace System.Runtime.Serialization.Formatters.Binary\r
 {\r
@@ -360,26 +359,28 @@ namespace System.Runtime.Serialization.Formatters.Binary
                                        return;\r
                                }\r
                                \r
+                               Hashtable typesTable;\r
+                               bool isNew = false;\r
+                               lock (_cachedTypes) {\r
+                                       typesTable = (Hashtable) _cachedTypes [_context.State];\r
+                                       if (typesTable == null) {\r
+                                               typesTable = new Hashtable ();\r
+                                               _cachedTypes [_context.State] = typesTable;\r
+                                               isNew = true;\r
+                                       }\r
+                               }\r
+\r
                                metadata = null;\r
-                               lock (_cachedTypes)\r
-                               {\r
-                                       Hashtable typesTable = (Hashtable) _cachedTypes [_context.State];\r
-                                       if (typesTable != null)\r
-                                       {\r
+                               lock (typesTable) {\r
+                                       if (!isNew) {\r
                                                metadata = (TypeMetadata) typesTable [instanceType];\r
-                                               if (metadata == null) \r
-                                               {\r
-                                                       metadata = CreateMemberTypeMetadata (instanceType);\r
-                                                       typesTable [instanceType] = metadata;\r
-                                               }\r
                                        }\r
-                                       else\r
-                                       {\r
+\r
+                                       if (metadata == null) {\r
                                                metadata = CreateMemberTypeMetadata (instanceType);\r
-                                               typesTable = new Hashtable ();\r
-                                               typesTable [instanceType] = metadata;\r
-                                               _cachedTypes [_context.State] = typesTable;\r
                                        }\r
+\r
+                                       typesTable [instanceType] = metadata;\r
                                }\r
                        }\r
                }\r
@@ -462,31 +463,8 @@ namespace System.Runtime.Serialization.Formatters.Binary
                        }\r
                        else\r
                        {\r
-                               int[] indices = new int[array.Rank];\r
-\r
-                               // Initialize indexes\r
-                               for (int dim = array.Rank-1; dim >= 0; dim--)\r
-                                       indices[dim] = array.GetLowerBound (dim);\r
-\r
-                               bool end = false;\r
-                               while (!end)\r
-                               {\r
-                                       WriteValue (writer, elementType, array.GetValue (indices));\r
-\r
-                                       for (int dim = array.Rank-1; dim >= 0; dim--)\r
-                                       {\r
-                                               indices[dim]++;\r
-                                               if (indices[dim] > array.GetUpperBound (dim))\r
-                                               {\r
-                                                       if (dim > 0) {\r
-                                                               indices[dim] = array.GetLowerBound (dim);\r
-                                                               continue;       // Increment the next dimension's index\r
-                                                       }\r
-                                                       end = true;     // That was the last dimension. Finished.\r
-                                               }\r
-                                               break;\r
-                                       }\r
-                               }\r
+                               foreach (object item in array)\r
+                                       WriteValue (writer, elementType, item);\r
                        }\r
                }\r
 \r
@@ -605,9 +583,8 @@ namespace System.Runtime.Serialization.Formatters.Binary
                private void WriteSingleDimensionArrayElements (BinaryWriter writer, Array array, Type elementType)\r
                {\r
                        int numNulls = 0;\r
-                       for (int n = array.GetLowerBound (0); n<=array.GetUpperBound(0); n++)\r
+                       foreach (object val in array)\r
                        {\r
-                               object val = array.GetValue (n);\r
                                if (val != null && numNulls > 0)\r
                                {\r
                                        WriteNullFiller (writer, numNulls);\r
@@ -760,7 +737,7 @@ namespace System.Runtime.Serialization.Formatters.Binary
                                        break;\r
 \r
                                case TypeCode.Decimal:\r
-                                       writer.Write ((decimal) value);\r
+                                       writer.Write (((decimal) value).ToString (CultureInfo.InvariantCulture));\r
                                        break;\r
 \r
                                case TypeCode.Double:\r