【发布时间】:2019-12-30 12:01:40
【问题描述】:
我正在将一个库从 .net framework 4.7 迁移到 .net core 2.2,并发现 deep object cloning 存在问题,我将其缩小为下面的简短可重现代码 sn-p。
自己试试吧:
- .net framework 4.7.2(通过)
- .net core 2.2(失败)
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");
}
}
}
}
在使用 .net core 2.2 的 Windows 平台上,这可以正常工作,但在 Linux 平台上出现异常:
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)
问题:如何在 Linux 的 .net core 2.2 中使用带有 TimeZoneInfo 的二进制序列化?
【问题讨论】:
-
当我尝试它时,它适用于 .Net Core 2.1(我没有安装 2.2)。它在 2.1 中对你有用吗?
-
刚刚尝试过,它适用于我的 .Net Core 2.2...
-
@MatthewWatson - 这在基于 Linux 的环境中是否适合您?正如 OP 发布的那样,它可以在 Windows 上正常工作,但不适用于基于 Linux 的系统
-
你尝试过干净的构建吗?升级后可能无法重建代码。检查项目 bin 文件夹中可执行文件的日期时间(发布和调试)。
-
对于任何感兴趣的人,我已将此问题报告给 .net core repo github.com/dotnet/core/issues/3254
标签: c# .net serialization .net-core timezone