Где этот несеризуемый объект?
-
24-10-2019 - |
Вопрос
Я пытаюсь сериализовать объект, и выбрасывается следующая сериализация Exception:
Type 'System.Linq.Enumerable+D__71`1 [[[System.String, MSCORLIB, версия = 4.0.0.0, культура = нейтральный, publicKeyToken = b77a5c561934e089]]' в сборке 'System.core, версия = 4.0.0, культура = Нейтральный, publickeyToken = b77a5c561934e089 'не отмечен как сериализуемый.
Где этот объект в моем коде? Как я узнаю? График объекта довольно большой.
Решение
Попробуйте использовать отражатель и посмотреть, сможете ли вы определить, где анонимный тип d__71`1
используется в вашем коде.
Другие советы
Мне кажется, что вы сохранили результаты вызова метода перечисления без преобразования результата в список.
Когда у вас есть такой метод, как это:
public IEnumerable<string> GetMyWidgetNames()
{
foreach (var x in MyWidgets)
{
yield return x.Name;
}
}
Компилятор превращает это в вложенный объект с таким именем, как то, что вы видите (один с именем, которого вы никогда не сможете создать из -за встроенного +
)
Если вы затем сохраните ссылку на этот объект внутри того, что вы пытаетесь сериализировать, вы получите исключение, отмеченное OP.
«Исправление» состоит в том, чтобы гарантировать, что ваши сериализованные объекты всегда конвертируют любые ienumerable <> назначения в списки. Вместо этого
public IEnumerable<string> WidgetNames { get; set; }
вам нужно написать:
public IEnumerable<string> WidgetNames
{
get { return mWidgetNames; }
set
{
if (value == null)
mWidgetNames= null
else mWidgetNames= value.ToList();
}
}
private List<string> mWidgetNames;
Попробуйте сериализовать объект (один тип) за раз и посмотрите, когда он взорвется. Вы можете сделать это вручную или через размышления.