2004-05-29 Gonzalo Paniagua Javier <gonzalo@ximian.com>
[mono.git] / mcs / class / corlib / System.Runtime.Serialization.Formatters.Binary / ObjectWriter.cs
index f464cc8e128f417320f89600ae6825fa7179196e..bb0a24ed6e589a514018d3a49ba8f3ff3bc35d3b 100644 (file)
@@ -5,8 +5,6 @@
 //\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
@@ -361,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
@@ -463,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
@@ -606,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