2011-10-09 17 views
7

我對序列化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的,所以應該默認序列化。

任何人都可以告訴我,我在這裏做錯了嗎?我將不勝感激任何幫助。

謝謝。

回答

6

我不知道爲什麼它不僅僅是簡單的序列化,而是你認爲只是序列化了ID?這可能會更有效 - 更簡單! - 比序列化內部的所有信息,只要兩個系統都有該時區,就應該沒問題。

編輯:請注意,這將無法與自定義時區,您應該看看ToSerializedString如其他地方所述。

+1

是啊,我的意思是作爲一個替代我會做這一類東西。但我想要強類型的變量,一般來說我有點神祕,爲什麼這不起作用。如果我不能序列化它,那麼這個類的ISerializable有什麼意義呢? – RedOctober

+1

@RedOctober:我不知道 - 這看起來很奇怪。我對WCF瞭解的不多,不知道DataContractSerializer是否使用與正常的BinarySerializer相同的格式,這是我相信的。ISerializable的含義。請注意,如果僅序列化ID,那麼當您再次獲取時區時,您將從操作系統獲得最新信息,而不僅僅是序列化時已知的信息。當然,這是否是好事取決於你的確切情況。 –

+1

1.行爲看起來像框架中的錯誤。 2.當您獲得自定義時區時,ID將不夠用。我使用了ToSerializedString方法作爲解決方法。 (http://msdn.microsoft.com/en-us/library/system.timezoneinfo.toserializedstring(v=vs.100).aspx) –

1

我不知道爲什麼要麼。正如喬恩所建議的,使用ID的代理資產可能是最好的選擇。

或者,如果您確實需要傳輸TimeZoneInfo的內容並支持自定義區域,則應使用包含ToSerializedString()FromSerializedString()的代理屬性。