Пройдите и найдите все экземпляры заданного типа в сложном графе объектов

(используя vb.Net 4.0) Скажем, у вас есть объект, граф которого довольно сложен - у него есть свойства, массивы и другие коллекции, подклассы со своими собственными свойствами и коллекциями и т. д. Я хочу полностью пройти весь граф объектов и найти все экземпляры определенного типа T, чтобы затем выполнить определенную операцию над этими экземплярами. Есть ли надежный способ выполнить полный обход графа объектов? Даже с учетом размышлений это кажется сложной задачей, чреватой ошибками.

Мне было интересно узнать о двоичной сериализации, поскольку она, кажется, клонирует объект, каким бы сложным он ни был, довольно надежным способом. Есть ли способ изменить этот метод, чтобы вместо его сериализации вместо этого возвращался список ссылок на все подобъекты данного типа T? Но это всего лишь предположение, я открыт для любого возможного решения.


person Tekito    schedule 19.01.2012    source источник


Ответы (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, которые затем можно закодировать для выполнения любой желаемой задачи после десериализации. В дальнейшем вы будете иметь дело только с сериализованными объектами.

Очевидно, что у сериализации могут быть сложности, и этот метод не будет работать во всех ситуациях. Довольно неэлегантно с точки зрения производительности. Но мне нужен был беспроблемный и тщательный обход графа объектов, вот и все.

person Tekito    schedule 20.01.2012