Отладка проблем сериализации в C # - PullRequest
1 голос
/ 22 июля 2010

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

Именно здесь начинается путаница.Первое действие копирования и вставки взаимодействует с объектами того же типа, что и второе.Но второе приводит к исключению.

Чтобы быть более подробным, у меня есть класс Slide, это класс, который является целью операции копирования и вставки.Итак, я помещаю экземпляр этого объекта в буфер обмена и снова вставляю его в тот же контейнер.Это работает как задумано.Теперь я копирую этот вставленный объект и пытаюсь вставить его.Это когда исключение выдается.Исключение жалуется на класс SlideEditorUi.SlideEditorUi - это UserControl, который взаимодействует с классом с именем SlideEditor.Который в свою очередь взаимодействует с экземпляром Slide.Но ни у одного экземпляра Slide нет ссылки на какой-либо из упомянутых классов.
Поэтому мне действительно интересно, почему процедура сериализации учитывает этот класс.И почему это происходит только тогда, когда я копирую копию?

Ответы [ 2 ]

2 голосов
/ 22 июля 2010

Обычно проблема в этом сценарии - это событие, содержащее ссылку на другой объект. BinaryFormatter следует за базовым полем обратно к объекту и boom .

Если вы можете найти оскорбительное событие, которое можете использовать (для «полевого» события):

[field:NonSerialized]
public event SomeEventHandler EventName;

или для явной реализации добавьте [NonSerialized] в поле поддержки.

В качестве альтернативы; используйте что-то отличное от BinaryFormatter; p Json или xml создают простые форматы, которые можно использовать через строку, или для больших / более сложных объектов существуют другие двоичные форматы сериализации.

0 голосов
/ 22 июля 2010

Ошибка связана с частью вашего объекта данных, которая не содержит SerializableAttribute. Почему это не бросает сериализацию, но делает повторно сериализацию, я не знаю. Возможно, было бы хорошо увидеть POCO, который вы пытаетесь сериализовать. Я подозреваю, что вы действительно пропускаете этот атрибут в свойстве или поле.

Обратите внимание на следующее (из ссылки на документацию выше), особенно слово «граф», означающее, что все классы, родительские элементы, агрегаты и ссылки должны быть сериализуемыми, чтобы ошибка не генерировалась:

Применить атрибут SerializableAttribute атрибут типа, чтобы указать, что экземпляры этого типа могут быть сериализованная. Общий язык время выполнения выдает исключение SerializationException если какой-либо тип в графе объектов сериализация не имеет Атрибут SerializableAttribute приложенное.

...