c#TimeZoneInfo序列化

时间:2011-10-09 16:33:55

标签: c# wcf serialization timezone

序列化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方法时,它会抛出异常:

  

不要求输入数据合约名称为“ArrayOfTimeZoneInfo.AdjustmentRule:http://schemas.datacontract.org/2004/07/System”的System.TimeZoneInfo + AdjustmentRule []'。考虑使用DataContractResolver或将任何静态未知的类型添加到已知类型列表中 - 例如,使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中。

如果我尝试添加 [KnownType(typeof(System.TimeZoneInfo.AdjustmentRule []))]到类我得到相同的错误。如果我将此行添加到我的数据协定界面,我会收到编译错误:

  

错误1'System.TimeZoneInfo.AdjustmentRule'由于其保护级别而无法访问

根据文档,TimeZoneInfo类实现了ISerializable,因此它应该默认序列化。

谁能告诉我这里我做错了什么?我将不胜感激任何帮助。

感谢。

3 个答案:

答案 0 :(得分:6)

我不确定为什么它不仅仅是序列化,而是您考虑过序列化ID?这可能会更有效 - 而且更简单! - 而不是序列化内部的所有信息,只要两个系统都有该时区,就应该没问题。

编辑:请注意,这不适用于自定义时区,您应该按照其他地方的说明查看ToSerializedString

答案 1 :(得分:1)

我也不确定为什么。正如乔恩所建议的,具有ID的代理属性可能是要走的路。

或者,如果您确实需要传输TimeZoneInfo的内容并支持自定义区域,则应使用包裹ToSerializedString()FromSerializedString()的代理属性。

答案 2 :(得分:0)

看起来TimeZoneInfo无法在开箱即用的情况下与WCF一起使用。 解决方法可以在这里找到:

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