Страницы

Поиск по вопросам

пятница, 31 января 2020 г.

Почему при сериализации получается рекурсия?

#c_sharp #wpf #json #рекурсия #serialize


Почему когда я хочу сериализовать в JSON какой нибудь контрол, то вылазит рекурсия?

JavaScriptSerializer serializer = new JavaScriptSerializer();
string json = serializer.Serialize(label1);

    


Ответы

Ответ 1



Потому что у контрола есть ссылка на родительский контрол, а у того список ссылок на детей - круг замкнулся. Можно написать свою обертку, у которой только те свойства, которые Вы хотите сохранить. public class ControlWrapper { private Control fControl; public ControlWrapper(Control aControl) { fControl = aControl; } public int Width { get { return fControl.Width; } } ... } JavaScriptSerializer serializer = new JavaScriptSerializer(); string json = serializer.Serialize(new ControlWrapper(label1));

Ответ 2



Потому что вы пытаетесь сериализировать несериализируемое: UI-контрол. Контролы не предназначены для сериализации, т. к. у них есть внутреннее состояние и внутренние привязки (например — подписки на события), которые невозможно сохранить при сериализации. Делайте правильно, сохраняйте модель, а не представление. Срезать углы не выйдет.

Ответ 3



Раз вы используете wpf, можно попробовать XAML-сериализацию.

Комментариев нет:

Отправить комментарий