Пройдите и найдите все экземпляры данного типа в графе сложных объектов - PullRequest
0 голосов
/ 19 января 2012

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

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

1 Ответ

0 голосов
/ 21 января 2012

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

По сути, у меня есть свой тип T, реализующий ISerializable, затем я могу обработать постсериализацию, добавив в класс:

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

Другим способом (без реализации Iserializable) является создание постсериализованного метода с атрибутом «OnDeserialized».

В любом случае, вы можете поместить информацию в объект streamingContext, который я использовал для описания операции, которую я хочу выполнить над экземплярами типа T. Таким образом, в основном, сериализуйте родительский объект, который найдет и сериализует все подобъекты типа T, которые затем могут быть закодированы для выполнения любой желаемой задачи при десериализации. В дальнейшем вы будете иметь дело только с сериализованными объектами.

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

...