我對序列化TimeZoneInfo對象有點問題。我試圖在WCF服務的數據約定中使用TimeZoneInfo變量,但是序列化失敗。所以我寫了一小段代碼來測試序列化。這裏有一個我做的:c#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方法拋出異常:
Type 'System.TimeZoneInfo+AdjustmentRule[]' with data contract name 'ArrayOfTimeZoneInfo.AdjustmentRule:http://schemas.datacontract.org/2004/07/System' is not expected. Consider using a DataContractResolver or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.
如果我嘗試添加 [KnownType(typeof運算(System.TimeZoneInfo.AdjustmentRule [] ))]到類我得到相同的錯誤。如果我這行添加到我的數據合同界面我得到編譯錯誤:
Error 1 'System.TimeZoneInfo.AdjustmentRule' is inaccessible due to its protection level
,並根據文檔的TimeZoneInfo類實現ISerializable的,所以應該默認序列化。
任何人都可以告訴我,我在這裏做錯了嗎?我將不勝感激任何幫助。
謝謝。
是啊,我的意思是作爲一個替代我會做這一類東西。但我想要強類型的變量,一般來說我有點神祕,爲什麼這不起作用。如果我不能序列化它,那麼這個類的ISerializable有什麼意義呢? – RedOctober
@RedOctober:我不知道 - 這看起來很奇怪。我對WCF瞭解的不多,不知道DataContractSerializer是否使用與正常的BinarySerializer相同的格式,這是我相信的。ISerializable的含義。請注意,如果僅序列化ID,那麼當您再次獲取時區時,您將從操作系統獲得最新信息,而不僅僅是序列化時已知的信息。當然,這是否是好事取決於你的確切情況。 –
1.行爲看起來像框架中的錯誤。 2.當您獲得自定義時區時,ID將不夠用。我使用了ToSerializedString方法作爲解決方法。 (http://msdn.microsoft.com/en-us/library/system.timezoneinfo.toserializedstring(v=vs.100).aspx) –