c#时区信息序列化

c#时区信息序列化,c#,wcf,serialization,timezone,C#,Wcf,Serialization,Timezone,我对序列化TimeZoneInfo对象有点问题。我试图在WCF服务的数据协定中使用TimeZoneInfo变量,但序列化失败。所以我写了这段代码来测试序列化。以下是我的工作: var fileName = "tmp.xml"; var tz = TimeZoneInfo.Local; var dataSer = new DataContractSerializer(typeof(TimeZoneInfo)); try

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

键入“System.TimeZoneInfo+AdjustmentRule[]”,数据协定名称为“ArrayOfTimeZoneInfo.AdjustmentRule”:http://schemas.datacontract.org/2004/07/System”他说。考虑使用DATACONTRORTCORDEVER或将未知类型的任何类型添加到已知类型的列表中——例如,使用NoNyType属性或将它们添加到传递给DATACONTROTTRORIGLASER的已知类型列表中。 如果我尝试添加 [KnownType(typeof(System.TimeZoneInfo.AdjustmentRule[])到类,我得到相同的错误。如果我将这一行添加到我的数据契约接口,我会得到编译错误:

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

根据文档,TimeZoneInfo类实现ISerializable,因此默认情况下应该序列化

有人能告诉我我做错了什么吗?我将感谢任何帮助


谢谢

我不知道为什么它不只是简单地序列化,但是您是否考虑过只序列化?这可能会更有效,更简单而不是序列化里面的所有信息,只要两个系统都有那个时区就可以了


编辑:请注意,这对自定义时区不起作用,对于自定义时区,您应该查看其他地方提到的
到序列化字符串

我也不确定原因。正如Jon所建议的,ID为的代理属性可能是最好的选择


或者,如果您确实需要传输TimeZoneInfo的内容并支持自定义区域,则应该使用代理属性,该属性包装
到序列化字符串()
,并且
从序列化字符串()

看起来TimeZoneInfo无法很好地与WCF一起开箱即用。 可在此处找到解决方法:


是的,我的意思是,作为一个工作环境,我必须做类似的事情。但是我想把变量强类型化,总的来说,我有点搞不懂为什么这不起作用。如果我不能序列化这个类,那么它可以被ISerializable有什么意义呢?@RedOctober:我不知道-这看起来很奇怪。我对WCF了解不够,无法知道DataContractSerializer是否使用与普通BinarySerializer相同的格式,我相信ISerializable就是关于这个格式的。请注意,如果仅序列化ID,那么当再次获取时区时,您将从操作系统获得最新信息,而不仅仅是序列化时已知的信息。当然,这是好事还是坏事取决于你的具体情况。该行为看起来像框架中的bug。2.如果你有自定义时区,ID是不够的。我使用序列化字符串方法作为解决方法。()@PuterdoBorato:是的,但我怀疑大多数程序是否会使用自定义时区,是吗?(不过我应该提到。)@JonSkeet您在ISerializable上是正确的,它是BinarySerializer,而不是DataContractSerializer。WCF开箱即用不完全支持这些类型。您可以在声明时转换为字符串,也可以跨包含日期时间和偏移量(以秒为单位)的customer对象发送。如果具有WSDL访问权限的客户机没有正确地将类型解释为UTC,则可能会出现问题。这就是为什么我觉得您的“字符串”解决方案可能更安全,因为您可以在另一端解析数据。如果您完全控制前端(如MVC),则可以执行“OnDeserialized”。