Проблема сериализации .NET - PullRequest
       5

Проблема сериализации .NET

0 голосов
/ 14 января 2010

Я получаю исключение «Тип XXX не помечен как сериализуемый», когда я пытаюсь сериализовать мой объект. Это может звучать глупо, но моя проблема в том, что я не могу найти какие-либо ссылки на объект типа XXX где-либо на графе объектов (используя окна наведения отладчика). Кто-нибудь знает хороший способ сканирования графа объектов для чего-либо такого типа?

Это сложный граф объектов (глубиной 100 уровней), поэтому я уверен, что где-то должно быть поле типа XXX, но я просто не могу его найти.

Ответы [ 5 ]

2 голосов
/ 14 января 2010

Если исключения не дают достаточно информации, атрибут [XmlIgnore] очень полезен для отслеживания преступника.

Бросьте все на объект, который вы пытаетесь сериализовать. Затем удалите его по одному. Когда объект больше не сериализуется, вы знаете, что проблема заключается в том, что это свойство не сериализуемо. Детализируйте этот класс, отметьте все как [XmlIgnore] и повторите.

В конце концов вы найдете это.

1 голос
/ 14 января 2010

Другой вариант - отладка кода сериализации. Способ сделать это состоит в том, чтобы поставить / поймать ваш вызов в Serialize и иметь точку прерывания в вашем улове. Затем, когда сгенерировано исключение get, перетащите желтую полосу на одну строку выше, где вызывается Serialize get, и на этот раз вы сможете установить точку останова внутри кода сериализации, если знаете, где хранится код.

Это потому, что метод Serialize фактически генерируется и компилируется при первом запуске. Вы можете увидеть более подробную информацию о том, как это сделать, в этом блоге .

1 голос
/ 14 января 2010

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

[field:NonSerializable]
event MyEventHandler MyEvent;

За исключением этого, это может помочь нам, если вы разместите код для своего класса.

1 голос
/ 14 января 2010

Являются ли какие-либо из ваших объектов производными от типа XXX или какие-либо свойства типа, который вы пытаетесь сериализовать, получены от типа XXX?

0 голосов
/ 14 января 2010

Вы можете начать проверять внутренние исключения внутренних исключений. Обычно, когда у меня возникают проблемы с сериализацией, я сталкиваюсь с 3 или 4 вложенными внутренними исключениями, прежде чем узнаю, что это было свойство A класса B, которое было свойством класса C, которое было где-то в списке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...