From: Egor Bogatov Date: Thu, 21 Sep 2017 05:57:35 +0000 (+0300) Subject: [corlib] Fix 44255: Inconsistent results in the serialization of TimeZoneInfo. ... X-Git-Url: http://wien.tomnetworks.com/gitweb/?p=mono.git;a=commitdiff_plain;h=ccb1921b7b7c5aeed57744d1f21f7fa3ce82066b [corlib] Fix 44255: Inconsistent results in the serialization of TimeZoneInfo. (#5576) --- diff --git a/mcs/class/corlib/System/TimeZoneInfo.Serialization.cs b/mcs/class/corlib/System/TimeZoneInfo.Serialization.cs index b272a20f00c..b78b5536b8e 100644 --- a/mcs/class/corlib/System/TimeZoneInfo.Serialization.cs +++ b/mcs/class/corlib/System/TimeZoneInfo.Serialization.cs @@ -42,12 +42,14 @@ namespace System var displayName = DeserializeString (ref input); var standardName = DeserializeString (ref input); var daylightName = DeserializeString (ref input); - var rules = new List (); + List rules = null; while (input [0] != ';') { + if (rules == null) + rules = new List (); rules.Add (DeserializeAdjustmentRule (ref input)); } var offsetSpan = TimeSpan.FromMinutes (offset); - return TimeZoneInfo.CreateCustomTimeZone (tzId, offsetSpan, displayName, standardName, daylightName, rules.ToArray ()); + return TimeZoneInfo.CreateCustomTimeZone (tzId, offsetSpan, displayName, standardName, daylightName, rules?.ToArray ()); } public string ToSerializedString () diff --git a/mcs/class/corlib/System/TimeZoneInfo.cs b/mcs/class/corlib/System/TimeZoneInfo.cs index 1c5cdd3ae82..25d9e9a39be 100644 --- a/mcs/class/corlib/System/TimeZoneInfo.cs +++ b/mcs/class/corlib/System/TimeZoneInfo.cs @@ -624,7 +624,7 @@ namespace System else ParseRegTzi(adjustmentRules, 1, 9999, reg_tzi); - return CreateCustomTimeZone (id, baseUtcOffset, display_name, standard_name, daylight_name, ValidateRules (adjustmentRules).ToArray ()); + return CreateCustomTimeZone (id, baseUtcOffset, display_name, standard_name, daylight_name, ValidateRules (adjustmentRules)); } private static void ParseRegTzi (List adjustmentRules, int start_year, int end_year, byte [] buffer) @@ -1231,8 +1231,11 @@ namespace System return new DateTime (year, transition.Month, day) + transition.TimeOfDay.TimeOfDay; } - static List ValidateRules (List adjustmentRules) + static AdjustmentRule[] ValidateRules (List adjustmentRules) { + if (adjustmentRules == null || adjustmentRules.Count == 0) + return null; + AdjustmentRule prev = null; foreach (AdjustmentRule current in adjustmentRules.ToArray ()) { if (prev != null && prev.DateEnd > current.DateStart) { @@ -1240,7 +1243,7 @@ namespace System } prev = current; } - return adjustmentRules; + return adjustmentRules.ToArray (); } #if LIBC || MONOTOUCH @@ -1404,13 +1407,13 @@ namespace System } tz = CreateCustomTimeZone (id, baseUtcOffset, id, standardDisplayName); } else { - tz = CreateCustomTimeZone (id, baseUtcOffset, id, standardDisplayName, daylightDisplayName, ValidateRules (adjustmentRules).ToArray ()); + tz = CreateCustomTimeZone (id, baseUtcOffset, id, standardDisplayName, daylightDisplayName, ValidateRules (adjustmentRules)); } if (storeTransition && transitions.Count > 0) { tz.transitions = transitions; - tz.supportsDaylightSavingTime = true; } + tz.supportsDaylightSavingTime = adjustmentRules.Count > 0; return tz; } diff --git a/mcs/class/corlib/Test/System/TimeZoneInfo.SerializationTest.cs b/mcs/class/corlib/Test/System/TimeZoneInfo.SerializationTest.cs index f4d0cfa1e8c..b53a8d4496a 100644 --- a/mcs/class/corlib/Test/System/TimeZoneInfo.SerializationTest.cs +++ b/mcs/class/corlib/Test/System/TimeZoneInfo.SerializationTest.cs @@ -1,5 +1,6 @@ using System; using System.IO; +using System.Linq; using NUnit.Framework; namespace MonoTests.System @@ -24,6 +25,20 @@ namespace MonoTests.System Assert.AreEqual (0, utc.GetAdjustmentRules ().Length); } + [Test] // Bug-44255 + public void SystemTimeZoneSerializationTests () + { + foreach (var tmz in TimeZoneInfo.GetSystemTimeZones ()) + { + var tmzClone = TimeZoneInfo.FromSerializedString (tmz.ToSerializedString ()); + Assert.AreEqual (tmz, tmzClone); + Assert.AreEqual (tmz.DisplayName, tmzClone.DisplayName); + Assert.AreEqual (tmz.StandardName, tmzClone.StandardName); + Assert.AreEqual (tmz.SupportsDaylightSavingTime, tmzClone.SupportsDaylightSavingTime); + Assert.AreEqual (tmz.DaylightName, tmzClone.DaylightName); + } + } + [Test] public void SerializeCustomUtcZoneWithOddNaming () {