我需要定義一個方法參數,理想情況下應該只接受已使用Serializable
屬性修飾的對象參數。方法任務是將對象參數保存到XML文檔中。如何識別具有序列化屬性的類型?
我知道我最終可以檢查SerializationException
,但我寧願能夠整潔地將其定義爲方法合同的一部分。那麼,有什麼辦法可以隔離已使用此屬性進行裝飾的類型?
我需要定義一個方法參數,理想情況下應該只接受已使用Serializable
屬性修飾的對象參數。方法任務是將對象參數保存到XML文檔中。如何識別具有序列化屬性的類型?
我知道我最終可以檢查SerializationException
,但我寧願能夠整潔地將其定義爲方法合同的一部分。那麼,有什麼辦法可以隔離已使用此屬性進行裝飾的類型?
一種選擇是使用Type
類的IsSerializable
屬性:
public void Serialize(object obj)
{
if (obj.GetType().IsSerializable)
{
// do work
}
}
可串行化裝飾對象不會自動實現ISerializable。另外,我不懷疑我能否檢查函數體內的類型有效性。我想知道的是,如果我可以與調用方簽訂一份合約,其中只有具有可序列化屬性的對象纔可以作爲參數傳遞。 – 2011-06-16 23:58:24
對於用'[Serializable]'裝飾的類,'IsSerializable'屬性返回true,但對於實現'ISerializable'的類,* *不會*。 – aligray 2011-06-17 00:09:22
我相信做到這一點的唯一方法是讓你的類實現'ISerializable',就像@Frank Boyne所建議的那樣。 – aligray 2011-06-17 00:10:35
可以使用GetCustomAttributes
功能上的物體的類型。
public void Serialize(object itemToSerialize)
{
var hasAttribute = itemToSerialize.GetType().GetCustomAttributes(typeof(SerializableAttribute), true).Any();
// Do stuff.
}
但是,不要忘記,正常的序列化也支持ISerializable
。因此,該類型的IsSerializable
屬性可能更合適。
編輯我認爲你是在以後的方式讓編譯器強制參數有屬性。沒有辦法做到這一點。你將不得不使用上面的運行時檢查並拋出異常。
泛型通常會成爲您此類任務的朋友,在這種情況下,您可以在類型實現ISerializable
時使用通用參數,但是您知道這將排除聲明序列化而非實現的情況。
是的。我可能有其他方法來做到這一點。但這不是我問的。仍然很高興知道我可以做到這一點。我可以看到不少其他有趣的應用程序。謝謝。 – 2011-06-17 00:01:06
@Krugar - 參見編輯。 – Reddog 2011-06-17 00:07:58
如果能進一步限制事情,所以,只有實現ISerializable的對象被允許,那麼你可以使用泛型得到編譯時檢查
public void Serialize<T>(T obj) where T : ISerializable
{
// Do work
}
不幸的是這並不算作一個回答你的問題,因爲不是每一個Serializable
類實現ISerializable
這個問題已被回答aligray(和Reddog的事情),但我似乎無法回去接受一個答案,因爲我不知不覺地在匿名模式中提出。我對此表示歉意。 – 2011-06-17 00:17:21