Где этот несериализуемый объект? - PullRequest
4 голосов
/ 16 марта 2011

Я пытаюсь сериализовать объект, и генерируется следующее исключение SerializationException:

Введите 'System.Linq.Enumerable + d__71`1 [[System.String, mscorlib, Версия = 4.0.0.0, Культура = нейтральный, PublicKeyToken = b77a5c561934e089]]' в сборке 'System.Core, Версия = 4.0.0.0 , Культура = нейтральный, PublicKeyToken = b77a5c561934e089 'не помечен как сериализуемый.

Где этот объект в моем коде? Как бы я узнал? Граф объектов довольно большой.

Ответы [ 3 ]

4 голосов
/ 16 марта 2011

Похоже, вы сохранили результаты вызова метода перечислителя без преобразования результата в список.

Когда у вас есть такой метод:

public IEnumerable<string> GetMyWidgetNames()
{
    foreach (var x in MyWidgets)
    { 
        yield return x.Name;
    }
}

Компилятор превращает это во вложенный объект с именем, подобным тому, которое вы видите (тот, с именем, которое вы никогда не сможете создать самостоятельно из-за встроенного +)

Если вы затем сохраните ссылку на этот объект внутри чего-то, что пытаетесь сериализовать, вы получите исключение, отмеченное ОП.

«Исправление» заключается в том, чтобы ваши сериализованные объекты всегда преобразовывали любые назначения 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;
4 голосов
/ 16 марта 2011

Попробуйте использовать Reflector и посмотрите, сможете ли вы определить, где анонимный тип d__71`1 используется в вашем коде.

0 голосов
/ 16 марта 2011

Попробуйте последовательно сериализовать объект (одного типа) и посмотрите, когда он взорвется.Вы можете сделать это вручную или с помощью отражения.

...