c# TimeZoneInfo serialization

本文关键字:serialization TimeZoneInfo | 更新日期: 2023-09-27 18:10:51

我有一点问题序列化TimeZoneInfo对象。我试图在WCF服务的数据合同中使用TimeZoneInfo变量,但序列化失败。所以我写了一小段代码来测试序列化。我是这样做的:

        var fileName = "tmp.xml";
        var tz = TimeZoneInfo.Local;
        var dataSer = new DataContractSerializer(typeof(TimeZoneInfo));
        try
        {
            using (var xml = new FileStream(fileName, FileMode.Create))
            {
                dataSer.WriteObject(xml, tz);
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }

现在,当我调用WriteObject方法时,它会抛出一个异常:

类型的系统。TimeZoneInfo+AdjustmentRule[]'与数据合约名称'ArrayOfTimeZoneInfo.AdjustmentRule:http://schemas.datacontract.org/2004/07/System'不被期望。考虑使用DataContractResolver或将任何未知静态类型添加到已知类型列表中—例如,通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中。

如果我尝试添加[KnownType(typeof(System.TimeZoneInfo.AdjustmentRule[]))]到类我得到相同的错误。如果我将这行添加到我的数据合约接口,我得到编译错误:

错误1 'System.TimeZoneInfo. '。由于其保护级别

,无法访问AdjustmentRule'

根据文档TimeZoneInfo类实现了isserializable,所以它应该默认序列化。

谁能告诉我我在这里做错了什么?我很感激你的帮助。

谢谢。

c# TimeZoneInfo serialization

我不确定为什么它不只是简单地序列化,但您是否考虑过只是序列化ID?这可能会更有效率——也更简单!-而不是序列化里面的所有信息,只要两个系统都有那个时区就应该没问题。

编辑:请注意,这不适用于自定义时区,您应该查看ToSerializedString,如其他地方所述。

我也不知道为什么。正如Jon所建议的,带ID的代理属性可能是可行的方法。

或者,如果你真的需要传输TimeZoneInfo的内容并支持自定义区域,你应该使用代理属性来包装ToSerializedString()FromSerializedString()

看起来TimeZoneInfo并不能很好地与WCF一起工作。解决方法可以在这里找到:

http://social.msdn.microsoft.com/forums/en/wcf/thread/f164f185 ae18 - 4775 - a2ff a814813d262d