2010-08-12 95 views
1

我想知道爲什麼IntPtr類型不受XmlSerializer實現支持。當我嘗試序列化一個包含IntPtr類型字段的類時,序列化會告訴我IntPtr不受支持,並忽略該成員。使用XmlSerializer序列化IntPtr

要解決此問題,我將IntPtr值轉換爲Int64 ...但這是一個好主意嗎?據我所知,應該是這樣。具體來說,我需要序列化一個窗口句柄,在.NET框架中鍵入IntPtr。我做得對嗎?

+0

您打算在相同的環境中對同一個系統上的窗口句柄進行反序列化嗎?也就是說,當您反序列化窗口句柄時,窗口句柄仍然有效嗎? – 2010-08-12 22:48:00

+0

當然可以。所有系統句柄在每個時刻都可能是無效的(即SafeHandle類存在的原因),因爲它們是由系統管理的。但這是另一個話題。 – Luca 2010-08-13 07:53:27

回答

3

IntPtr不可序列化的原因是,當您從環境中移除IntPtr時,它通常沒有任何意義。

如果你序列化一個窗口句柄,它只有當你在同一個地方反序列化它時纔有意義,而窗口仍然存在。如果您在另一臺計算機上,另一個應用程序中,或在刪除窗口後將其反序列化,則句柄沒有意義。

因此,您可以將其轉換爲可序列化的類型,但是由您確定在反序列化它時仍然有意義。

+0

這個參數可以適用於每一個信息,甚至一個字符串。例如,一個字符串可以指定一個共享內存名稱,並且在序列化之後它可能沒有意義。序列化能夠恢復任何對象的位配置,很明顯,一個IntPtr有一個位序列,可以序列化以及... – Luca 2010-08-13 07:51:45

+0

@Luca:它當然是基於數據類型的目標因爲,不是他們可能會(誤)用的。 – Guffa 2010-08-13 08:53:43

0

將IntPtr視爲void *。如果你想對它做任何有用的事情,你別無選擇,只能將它投向其他東西。

所以是的,將它轉換爲int64以序列化它是非常合理的。

相關問題