c#TimeZoneInfo序列化

Red*_*ber 7 c# wcf timezone serialization

我在序列化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);
        }
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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

谢谢.

Jon*_*eet 6

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

编辑:请注意,这不适用于自定义时区,您应该在ToSerializedString其他地方看到它们.