序列化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,因此它应该默认序列化。
谁能告诉我这里我做错了什么?我将不胜感激任何帮助。
感谢。
答案 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