首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Linux上反序列化TimeZoneInfo抛出“月份参数必须在1到12之间”

在Linux上反序列化TimeZoneInfo抛出“月份参数必须在1到12之间”
EN

Stack Overflow用户
提问于 2019-08-26 09:46:07
回答 1查看 199关注 0票数 3

我正在将一个库从.net框架4.7迁移到.net核心2.2,并发现深度对象克隆的一个问题,我在下面缩小到了一个简短的可重复代码片段。

你自己试试吧:

代码语言:javascript
复制
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核心2.2的Windows平台上,这很好,但我在Linux上得到了一个例外:

代码语言:javascript
复制
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中使用TimeZoneInfo内核2.2中的二进制序列化?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-26 16:57:06

实际上,这似乎是一种小虫子。感谢您提出的问题所在

然而,从你的评论看,似乎有一个简单的解决办法。与其序列化TimeZoneInfo,不如将对象更改为只序列化ID。如果您愿意的话,您可以在它周围放置一个带有get/set访问器的属性。

例如,而不是:

代码语言:javascript
复制
public class Foo
{
    public TimeZoneInfo TimeZone { get; set; }
}

你可以这样做:

代码语言:javascript
复制
public class Foo
{
    public string TimeZoneId { get; set; }

    public TimeZoneInfo TimeZone
    {
        get => TimeZoneInfo.FindSystemTimeZoneById(TimeZoneId);
        set => TimeZoneId = value.Id;
    }
}

BinaryFormatter只序列化字段,因此只有隐藏在TimeZoneId自动属性后面的字符串才会被序列化/反序列化。在序列化/反序列化期间,TimeZoneInfo将被忽略,并且只在您自己的代码中访问对象时使用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57655469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档