2011-06-16 35 views
2

我需要定義一個方法參數,理想情況下應該只接受已使用Serializable屬性修飾的對象參數。方法任務是將對象參數保存到XML文檔中。如何識別具有序列化屬性的類型?

我知道我最終可以檢查SerializationException,但我寧願能夠整潔地將其定義爲方法合同的一部分。那麼,有什麼辦法可以隔離已使用此屬性進行裝飾的類型?

+0

這個問題已被回答aligray(和Reddog的事情),但我似乎無法回去接受一個答案,因爲我不知不覺地在匿名模式中提出。我對此表示歉意。 – 2011-06-17 00:17:21

回答

5

一種選擇是使用Type類的IsSerializable屬性:

public void Serialize(object obj) 
{ 
    if (obj.GetType().IsSerializable) 
    { 
     // do work 
    } 
} 
+0

可串行化裝飾對象不會自動實現ISerializable。另外,我不懷疑我能否檢查函數體內的類型有效性。我想知道的是,如果我可以與調用方簽訂一份合約,其中只有具有可序列化屬性的對象纔可以作爲參數傳遞。 – 2011-06-16 23:58:24

+0

對於用'[Serializable]'裝飾的類,'IsSerializable'屬性返回true,但對於實現'ISerializable'的類,* *不會*。 – aligray 2011-06-17 00:09:22

+0

我相信做到這一點的唯一方法是讓你的類實現'ISerializable',就像@Frank Boyne所建議的那樣。 – aligray 2011-06-17 00:10:35

2

可以使用GetCustomAttributes功能上的物體的類型。

public void Serialize(object itemToSerialize) 
    { 
     var hasAttribute = itemToSerialize.GetType().GetCustomAttributes(typeof(SerializableAttribute), true).Any(); 

     // Do stuff. 
    } 

但是,不要忘記,正常的序列化也支持ISerializable。因此,該類型的IsSerializable屬性可能更合適。

編輯我認爲你是在以後的方式讓編譯器強制參數有屬性。沒有辦法做到這一點。你將不得不使用上面的運行時檢查並拋出異常。

泛型通常會成爲您此類任務的朋友,在這種情況下,您可以在類型實現ISerializable時使用通用參數,但是您知道這將排除聲明序列化而非實現的情況。

+0

是的。我可能有其他方法來做到這一點。但這不是我問的。仍然很高興知道我可以做到這一點。我可以看到不少其他有趣的應用程序。謝謝。 – 2011-06-17 00:01:06

+0

@Krugar - 參見編輯。 – Reddog 2011-06-17 00:07:58

0

如果能進一步限制事情,所以,只有實現ISerializable的對象被允許,那麼你可以使用泛型得到編譯時檢查

public void Serialize<T>(T obj) where T : ISerializable 
{ 
    // Do work 
} 

不幸的是這並不算作一個回答你的問題,因爲不是每一個Serializable類實現ISerializable

相關問題