c#TimeZoneInfo序列化

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

键入’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,因此它应该默认序列化。

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

谢谢。

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

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

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

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

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

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