我正在將一個庫從 .net Framework 4.7 遷移到 .net core 2.2,并發現了深度對象克隆的問題,我將其范圍縮小到下面的一個簡短的可重現代碼片段。自己嘗試一下:.net框架4.7.2(通過).net core 2.2(失?。﹗sing 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()問題:如何TimeZoneInfo在 Linux 中的 .net core 2.2 中使用二進制序列化?
1 回答

梵蒂岡之花
TA貢獻1900條經驗 獲得超5個贊
確實,這看起來像一個錯誤。
但是,從您的評論來看,似乎有一個簡單的解決方法。不要序列化TimeZoneInfo
,而是更改對象以僅序列化 ID。如果您愿意,您可以在其周圍放置一個帶有 get/set 訪問器的屬性,以方便使用。
例如,代替:
public class Foo
{
? ? public TimeZoneInfo TimeZone { get; set; }
}
你可以這樣做:
public class Foo
{
? ? public string TimeZoneId { get; set; }
? ? public TimeZoneInfo TimeZone
? ? {
? ? ? ? get => TimeZoneInfo.FindSystemTimeZoneById(TimeZoneId);
? ? ? ? set => TimeZoneId = value.Id;
? ? }
}
唯一BinaryFormatter序列化字段,因此只有隱藏在自動屬性后面的字符串TimeZoneId才會被序列化/反序列化。在序列化/反序列化期間將TimeZoneInfo被忽略,并且僅在您自己的代碼中訪問對象時使用。
- 1 回答
- 0 關注
- 119 瀏覽
添加回答
舉報
0/150
提交
取消