【问题标题】:Traverse and find all given type instances within complex object graph遍历并查找复杂对象图中的所有给定类型实例
【发布时间】:2012-01-19 17:50:43
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    基本上,我有我的类型 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 的子对象,然后可以对其进行编码以在反序列化时执行任何所需的任务。接下来,您将只处理序列化的对象。

    显然,序列化可能有复杂性,而且这种方法并不适用于所有情况。在性能方面也很不优雅。但我需要一个轻松且彻底的对象图遍历,所以你去吧。

    【讨论】:

      猜你喜欢
      • 2021-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-17
      • 2023-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多