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,所以它应该默认序列化。
谁能告诉我我在这里做错了什么?我很感激你的帮助。谢谢。
我不确定为什么它不只是简单地序列化,但您是否考虑过只是序列化ID?这可能会更有效率——也更简单!-而不是序列化里面的所有信息,只要两个系统都有那个时区就应该没问题。
编辑:请注意,这不适用于自定义时区,您应该查看ToSerializedString
,如其他地方所述。
我也不知道为什么。正如Jon所建议的,带ID的代理属性可能是可行的方法。
或者,如果你真的需要传输TimeZoneInfo的内容并支持自定义区域,你应该使用代理属性来包装ToSerializedString()
和FromSerializedString()
。
看起来TimeZoneInfo并不能很好地与WCF一起工作。解决方法可以在这里找到:
http://social.msdn.microsoft.com/forums/en/wcf/thread/f164f185 ae18 - 4775 - a2ff a814813d262d