遍历并查找复杂对象图中的所有给定类型实例

时间:2012-01-19 17:50:44

标签: reflection vb.net-2010 binary-serialization object-graph

(使用vb.Net 4.0)假设您有一个图形相当复杂的对象 - 它具有属性,数组和其他集合,具有自己的属性和集合的子类等。我想完全遍历整个对象图和找到特定类型T的所有实例,然后对这些实例执行特定操作。是否有一种防弹方式来执行对象图的完整遍历?即使有了反思,这似乎也很容易出错。

我想知道二进制序列化,因为它似乎以相当强大的方式克隆了一个对象,无论多么复杂。有没有办法修改该技术,这样,而不是序列化它而不是返回给定类型T的所有子对象的引用列表?但这只是纯粹的推测,我对任何可行的解决方案持开放态度。

1 个答案:

答案 0 :(得分:0)

我确定了一种方法,虽然它可能不是最好的方法。因为我的对象图是非常嵌套的&复杂的,我决定依靠二进制序列化,因为在我(有限)的经验中,它提供了最彻底的&强大的图遍历。缺点是二进制序列化会显着影响性能,但在基准测试后,它似乎不是我特定情况的限制因素。

基本上,我的类型T实现了ISerializable,然后我可以通过添加到类来处理序列化后的颜色:

 Protected Sub New(ByVal info As System.Runtime.Serialization.SerializationInfo,
                           ByVal context As System.Runtime.Serialization.StreamingContext)

另一种方法(没有实现Iserializable)是使用“OnDeserialized”属性创建一个后序列化方法。

无论如何,您可以将信息放入streamingContext对象,我用它来描述我想要在Type T实例上执行的操作。所以基本上,序列化父对象,它将查找并序列化T类型的所有子对象,然后可以对其进行编码以在反序列化时执行任何所需的任务。接下来,您只处理序列化对象。

显然,序列化可能会有复杂性,而且这种方法不适用于所有情况。非常优雅的表现也是如此。但我需要一个无忧无虑的&彻底的对象图遍历所以你去。