Я реализую ручную сериализацию, назначая formatter'у surrogate собственного производства. При этом я столкнулся с одной неприятной проблемой.
Возьмем, например, тип Point. В нем определено 3 поля: X, Y и статическое поле Empty. Причем последнее тоже является представителем типа Point с координатами (0,0),а следовательно в свою очередь помимо X и Y содержит Empty... Получается бесконечная рекурсия: в методе GetObjectData среди полей переданного объекта типа Point встречается Empty, для которого еще раз автоматически происходит вызов этого метода, и так далее, пока не заканчивается память =)
Это слишком грубое решение, статические поля сериализовывать надо, тем более что та же проблема возникла бы, если бы поле было экземплярным.
А не может ли эта проблема быть связана с тем, что свойсто типа Point IsLayoutSequential возвращает true, я посмотрел несколько других классов, у них оно было равно false...
G_>Это слишком грубое решение, статические поля сериализовывать надо
Лично мне это кажется бредом.Процесс сериализации обычно подразумевает сохранение состояния экземпляров. Статические поля не описывают состояния экземпляров.
G_>тем более что та же проблема возникла бы, если бы поле было экземплярным.
Циклы ссылок? Надо экземпляры занумеровывать и, когда второй раз встретился уже сериализованный объект, сохранять информацию о том, что "тут объект, который мы записали под номером 5".
При десериализации придется отдельным проходом восстанавливать такие ссылки.
G_>А не может ли эта проблема быть связана с тем, что свойсто типа Point IsLayoutSequential возвращает true, я посмотрел несколько других классов, у них оно было равно false...
Здравствуйте, <Аноним>, Вы писали:
А>Я реализую ручную сериализацию, назначая formatter'у surrogate собственного производства. При этом я столкнулся с одной неприятной проблемой.
А>Возьмем, например, тип Point. В нем определено 3 поля: X, Y и статическое поле Empty. Причем последнее тоже является представителем типа Point с координатами (0,0),а следовательно в свою очередь помимо X и Y содержит Empty... Получается бесконечная рекурсия: в методе GetObjectData среди полей переданного объекта типа Point встречается Empty, для которого еще раз автоматически происходит вызов этого метода, и так далее, пока не заканчивается память =)
А>Подскажите, что делать...
1. Не сериализовать статик поля. (Допускаю, что тебе ну просто обязательно надо.)
2. Объявить Empty как const и (правильно не сериализовать константы.
Здравствуйте, ie, Вы писали:
ie>Здравствуйте, <Аноним>, Вы писали:
А>>Я реализую ручную сериализацию, назначая formatter'у surrogate собственного производства. При этом я столкнулся с одной неприятной проблемой.
А>>Возьмем, например, тип Point. В нем определено 3 поля: X, Y и статическое поле Empty. Причем последнее тоже является представителем типа Point с координатами (0,0),а следовательно в свою очередь помимо X и Y содержит Empty... Получается бесконечная рекурсия: в методе GetObjectData среди полей переданного объекта типа Point встречается Empty, для которого еще раз автоматически происходит вызов этого метода, и так далее, пока не заканчивается память =)
А>>Подскажите, что делать...
ie>1. Не сериализовать статик поля. (Допускаю, что тебе ну просто обязательно надо.) ie>2. Объявить Empty как const и (правильно не сериализовать константы.
Бррр.... иногда во время перерыва в футбольном матче такая чушь рождается, не обращайте внимания.
В ничью скатали, жаль .... этот ЧМ будет без России. Хотя с другой стороны может и к лучшему — можно смотреть в свое удовольствие без всяких растройств...