Используя C # .NET 2.0, у меня есть составной класс данных, который имеет [Serializable]
атрибут. Я создаю XMLSerializer
класс и передаю его в конструктор:
XmlSerializer serializer = new XmlSerializer(typeof(DataClass));
Я получаю исключение, сказав:
Произошла ошибка, отражающая тип.
Внутри класса данных есть еще один составной объект. Нужно ли для этого иметь [Serializable]
атрибут или, если он находится на верхнем объекте, рекурсивно ли он применяется ко всем объектам внутри?
IList
когда это было необходимоList
.Помните, что сериализованные классы должны иметь конструкторы по умолчанию (т.е. без параметров). Если у вас нет конструктора вообще, это нормально; но если у вас есть конструктор с параметром, вам также нужно добавить конструктор по умолчанию.
источник
У меня была похожая проблема, и оказалось, что сериализатор не может различить 2 класса, которые у меня были с тем же именем (один был подклассом другого). Внутреннее исключение выглядело так:
Типы BaseNamespace.Class1 и BaseNamespace.SubNamespace.Class1 оба используют имя типа XML Class1 из пространства имен. Используйте атрибуты XML, чтобы указать уникальное имя XML и / или пространство имен для типа.
Где BaseNamespace.SubNamespace.Class1 является подклассом BaseNamespace.Class1.
Что мне нужно было сделать, это добавить атрибут в один из классов (я добавил в базовый класс):
Примечание. Если у вас есть несколько слоев классов, вам также необходимо добавить к ним атрибут.
источник
Также имейте в виду, что
XmlSerializer
не может сериализовать абстрактные свойства. Смотрите мой вопрос здесь (к которому я добавил код решения) ..Сериализация XML и унаследованные типы
источник
Наиболее распространенные мной причины:
источник
Все объекты в графе сериализации должны быть сериализуемыми.
Поскольку
XMLSerializer
это черный ящик, проверьте эти ссылки, если вы хотите продолжить отладку в процессе сериализации.Изменение того, где XmlSerializer выводит временные сборки
КАК: Отладить в сгенерированную сборку .NET XmlSerializer
источник
Если вам нужно обрабатывать определенные атрибуты (например, Словарь или любой другой класс), вы можете реализовать интерфейс IXmlSerialiable , который предоставит вам больше свободы за счет более подробного кодирования .
Есть интересная статья , в которой представлен элегантный способ реализации сложного способа «расширения» XmlSerializer.
В статье говорится:
Поэтому я предлагаю реализовать собственные
IXmlSerializable
классы, чтобы избежать слишком сложных реализаций.... было бы просто реализовать наш пользовательский
XmlSerializer
класс с помощью отражения.источник
Я обнаружил, что класс Dictionary в .Net 2.0 не сериализуем с использованием XML, но хорошо сериализуется, когда используется двоичная сериализация.
Я нашел работу вокруг здесь .
источник
Недавно я получил это в частичном классе веб-ссылок при добавлении нового свойства. Сгенерированный автоматически класс добавляет следующие атрибуты.
Мне нужно было добавить аналогичный атрибут с порядком на один выше, чем последний в автоматически сгенерированной последовательности, и это исправило это для меня.
источник
Я просто получил ту же ошибку и обнаружил, что
IEnumerable<SomeClass>
проблема связана со свойством типа . Похоже, чтоIEnumerable
не может быть сериализовано напрямую.Вместо этого можно использовать
List<SomeClass>
.источник
Я тоже подумал, что атрибут Serializable должен быть на объекте, но если я не являюсь полным нубом (я нахожусь в середине ночной сессии кодирования), из SnippetCompiler работает следующее :
Я полагаю, что XmlSerializer использует отражение над открытыми свойствами.
источник
У меня была ситуация, когда Орден был одинаковым для двух элементов подряд
.... некоторый код ...
Когда я изменил код для увеличения порядка на единицу для каждого нового свойства в классе, ошибка исчезла.
источник
Я получал ту же ошибку, когда создавал свойство с типом данных -
Type
. При этом я получил ошибку - произошла ошибка, отражающая тип. Я продолжал проверять 'InnerException' каждого исключения из дока отладки и получил конкретное имя поля (которое былоType
) в моем случае. Решение заключается в следующем:источник
Также обратите внимание, что вы не можете сериализовать элементы управления пользовательского интерфейса и что любой объект, который вы хотите передать в буфер обмена, должен быть сериализуемым, иначе он не может быть передан другим процессам.
источник
Я использовал этот
NetDataSerialiser
класс для сериализации классов моего домена. NetDataContractSerializer Class .Классы домена распределяются между клиентом и сервером.
источник
У меня была та же проблема, и в моем случае объект имел ReadOnlyCollection. Коллекция должна реализовывать метод Add для сериализации.
источник
У меня есть немного другое решение для всех описанных здесь до сих пор, так что для любой будущей цивилизации здесь мое!
Я объявил тип данных «время», так как исходный тип был a,
TimeSpan
а затем изменил наString
:Однако фактический тип был строкой
удалив
DateType
свойствоXml
можно сериализоватьисточник
Или
источник