2010-08-12 97 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以序列化它是非常合理的。

相关问题