I am migrating a library from .net framework 4.7 to .net core 2.2 and found an issue with deep object cloning that I narrowed down to a short reproducible code snippet below.
Try this yourself:
- .net framework 4.7.2 (Pass)
- .net core 2.2 (Fail)
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
namespace Test
{
public class Program
{
public static void Main(string[] args)
{
// any zone here, don't care what it is
var zone = TimeZoneInfo.GetSystemTimeZones()[0];
var formatter = new BinaryFormatter();
using (MemoryStream stream = new MemoryStream())
{
formatter.Serialize(stream, zone);
stream.Seek(0, SeekOrigin.Begin);
var result = formatter.Deserialize(stream);
Console.WriteLine("all ok");
}
}
}
}
On Windows platforms using .net core 2.2 this works fine, but I get an exception on Linux platforms:
Unhandled Exception: System.Runtime.Serialization.SerializationException: An error occurred while deserializing the object. The serialized data is corrupt. ---> System.ArgumentOutOfRangeException: The Month parameter must be in the range 1 through 12.
Parameter name: month
at System.TimeZoneInfo.TransitionTime.ValidateTransitionTime(DateTime timeOfDay, Int32 month, Int32 week, Int32 day, DayOfWeek dayOfWeek)
at System.TimeZoneInfo.TransitionTime.System.Runtime.Serialization.IDeserializationCallback.OnDeserialization(Object sender)
--- End of inner exception stack trace ---
at System.TimeZoneInfo.TransitionTime.System.Runtime.Serialization.IDeserializationCallback.OnDeserialization(Object sender)
at System.Runtime.Serialization.ObjectManager.RaiseDeserializationEvent()
at System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(BinaryParser serParser, Boolean fCheck)
at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, Boolean check)
at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream)
at Test.Program.Main(String[] args)
Question: how can I use binary serialization with TimeZoneInfo
in .net core 2.2 in Linux?