Сколько переменных указывают на объект и какие [.net] - PullRequest
0 голосов
/ 10 октября 2010

Я хочу создать свой собственный класс xml-serializer, потому что мне нужно другое форматирование, чем System.Xml.Serialization.XmlSerializer.Моя идея состоит в том, чтобы рассматривать свойства примитивного типа (такие как Integer, Double, String) как XmlAttributes.

Чтобы правильно реализовать используемую сериализацию Xml, мне нужно знать, какие переменные указывают на один и тот же объект (двоичная сериализация)ведет себя так)Потому что один объект должен быть сериализован только один раз, чтобы соединения не терялись.На стороне XmlSerialisation у меня есть идея вставить путь к классу как специальный XmlAttribute.

У вас есть советы для меня, как справиться с такой ситуацией?

### EDIT

Спасибо за ответы.
XmlAttributeAttribute, возможно, больше работы, чем написание моего собственного Serializer, потому что только переменныеиз примитивных типов (а их много) следует сериализовать как XmlAttributes.В таком случае совершить ошибку - это еще ужаснее.
Я бы, конечно, пока использовал какое-то решение для хеширования.Но моя идея состояла в том, чтобы уменьшить работу этого решения хеширования, если бы я мог убедиться, что объект ссылается только один раз.У вас есть ссылки на такой вопрос?

Ответы [ 3 ]

3 голосов
/ 10 октября 2010

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

С другой стороны, я бы постарался поработать со встроенным сериализатором, прежде чем придумать свой собственный. Например, для хранения значений в атрибутах вы можете использовать [XmlAttributeAttribute].

1 голос
/ 10 октября 2010

Вы можете использовать Hashtable объектов и убедиться, что ваш объект сериализуется один раз. Вы можете сохранить XML-представление объекта в значении. Затем вам нужно использовать XML ref, чтобы перезагрузить его один раз.

Обычно object.ReferenceEquals(o1, o2) сообщит вам, если объекты одинаковы.

Если честно, я не хочу быть на твоем месте. Это большая работа, и я не уверен, что создание сериализатора с нуля - это то, что нужно.

1 голос
/ 10 октября 2010

Вам не нужно подсчитывать количество переменных, которые указывают на каждый объект, чтобы сериализовать каждый объект только один раз.

Вместо этого вы можете сохранить список объектов, которые вы уже сериализовали, и для каждого нового объекта вы можете проверить, существует ли он уже в этом списке. Как вы сравниваете объекты, зависит от вас - например, вы можете использовать Equals или сравнить ссылки на объекты .

Если вы решите использовать Equals, тогда вы сможете получить более высокую производительность, поскольку можете хранить объекты в HashSet .

...