In System.Runtime.Serialization.Formatters.Binary:
authorRaja R Harinath <harinath@hurrynot.org>
Tue, 5 Sep 2006 12:10:14 +0000 (12:10 -0000)
committerRaja R Harinath <harinath@hurrynot.org>
Tue, 5 Sep 2006 12:10:14 +0000 (12:10 -0000)
Fix #79159
* ObjectWriter.cs (WritePrimitiveTypeArray) [NET_2_0]: Encode the
'Kind' of each DateTime.
* ObjectReader.cs (ReadArrayOfPrimitiveType) [NET_2_0]: Decode the
'Kind' of each DateTime.

In Test/System.Runtime.Serialization.Formatters.Binary:
* BinaryFormatterTest.cs (DateTimeArray): New test for
round-tripping DateTime arrays.

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

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/Test/System.Runtime.Serialization.Formatters.Binary/BinaryFormatterTest.cs
mcs/class/corlib/Test/System.Runtime.Serialization.Formatters.Binary/ChangeLog

index 23367f4a69510cb51e5f103e0acfcf7b650ef1b9..6d0572e2b3d2c355e2cb97c676ebb4b53b7e4e67 100644 (file)
@@ -1,3 +1,11 @@
+2006-09-05  Raja R Harinath  <rharinath@novell.com>
+
+       Fix #79159
+       * ObjectWriter.cs (WritePrimitiveTypeArray) [NET_2_0]: Encode the
+       'Kind' of each DateTime.
+       * ObjectReader.cs (ReadArrayOfPrimitiveType) [NET_2_0]: Decode the
+       'Kind' of each DateTime.
+
 2005-12-07  Sebastien Pouliot  <sebastien@ximian.com>
 
        * BinaryFormatter.cs: Implemented UnsafeDeserialize and 
index 705975f971f2403698477f6fdbbfad0a199086e1..de7b45a1cf2e44cd2946950b56e371dc7c3a0fed 100644 (file)
@@ -395,7 +395,17 @@ namespace System.Runtime.Serialization.Formatters.Binary
 \r
                                case TypeCode.DateTime: {\r
                                        DateTime[] arr = new DateTime [length];\r
-                                       for (int n = 0; n < length; n++) arr [n] = new DateTime (reader.ReadInt64());\r
+                                       for (int n = 0; n < length; n++) {\r
+                                               ulong nr = reader.ReadUInt64 ();\r
+                                               const ulong mask = (1ul << 62) - 1;\r
+                                               long ticks = (long) (nr & mask);\r
+#if NET_2_0\r
+                                               DateTimeKind kind = (DateTimeKind) (nr >> 62);\r
+                                               arr [n] = new DateTime (ticks, kind);\r
+#else\r
+                                               arr [n] = new DateTime (ticks);\r
+#endif\r
+                                       }\r
                                        val = arr;\r
                                        break;\r
                                }\r
index ea96c36cc3f16266e6ac6941881923c7c5681aa9..81d3fb82fbfb34241f64f2ce6a4c0501537c7cb1 100644 (file)
@@ -546,8 +546,13 @@ namespace System.Runtime.Serialization.Formatters.Binary
                                        break;\r
 \r
                                case TypeCode.DateTime: \r
-                                       foreach (DateTime item in (DateTime[]) array)\r
-                                               writer.Write (item.Ticks);\r
+                                       foreach (DateTime item in (DateTime[]) array) {\r
+                                               ulong val = (ulong) item.Ticks;\r
+#if NET_2_0\r
+                                               val |= ((ulong) item.Kind) << 62;\r
+#endif\r
+                                               writer.Write (val);\r
+                                       }\r
                                        break;\r
 \r
                                case TypeCode.Decimal:\r
index 21804ea69747e7b1881de81495c841fe12c428f8..d94dbfc2f42d94f58c64728ca11350de9f850249 100644 (file)
@@ -142,5 +142,31 @@ namespace MonoTests.System.Runtime.Serialization.Formatters.Binary {
                        Assert.AreEqual (Int32.MinValue, clone.Integer, "Integer");
                        Assert.IsFalse (clone.Boolean, "Boolean");
                }
+
+               [Test]
+               public void DateTimeArray ()
+               {
+                       DateTime [] e = new DateTime [6];
+                       string [] names = new string [6];
+
+                       names [0] = "Today";  e [0] = DateTime.Today;
+                       names [1] = "Min";    e [1] = DateTime.MinValue;
+                       names [2] = "Max";    e [2] = DateTime.MaxValue;
+                       names [3] = "BiCent"; e [3] = new DateTime (1976, 07, 04);
+                       names [4] = "Now";    e [4] = DateTime.Now;
+                       names [5] = "UtcNow"; e [5] = DateTime.UtcNow;
+
+                       BinaryFormatter bf = new BinaryFormatter ();
+                       MemoryStream ms = new MemoryStream ();
+
+                       bf.Serialize (ms, e);
+
+                       ms.Position = 0;
+                       DateTime [] a = (DateTime []) bf.Deserialize (ms);
+
+                       Assert.AreEqual (e.Length, a.Length);
+                       for (int i = 0; i < e.Length; ++i)
+                               Assert.AreEqual (e [i], a [i], names [i]);
+               }
        }
 }
index 0dcff64bee4ec7488280f09a7f3a6e31bf1af66c..670c5d155f4f768cba78a1d971652c7725391b97 100644 (file)
@@ -1,3 +1,8 @@
+2006-09-05  Raja R Harinath  <rharinath@novell.com>
+
+       * BinaryFormatterTest.cs (DateTimeArray): New test for
+       round-tripping DateTime arrays.
+
 2005-12-07  Sebastien Pouliot  <sebastien@ximian.com>
 
        * BinaryFormatterCas.cs: New. Partial CAS tests for BinaryFormatter.