4

我正在尝试序列化一个对象并引发以下 SerializationException:

在程序集 'System.Core, Version=4.0.0.0, Culture=中性,PublicKeyToken=b77a5c561934e089' 未标记为可序列化。

我的代码中的这个对象在哪里?我怎么知道?对象图相当大。

4

3 回答 3

4

听起来好像您已经存储了调用枚举器方法的结果,而没有将结果转换为列表。

当你有这样的方法时:

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;
于 2011-03-16T03:01:23.280 回答
4

尝试使用 Reflector 并查看是否可以确定匿名类型d__71`1在代码中的使用位置。

于 2011-03-16T02:33:11.060 回答
-1

尝试一次序列化一个对象(单一类型),看看它什么时候爆炸。您可以手动执行此操作,也可以通过反射执行此操作。

于 2011-03-16T02:33:35.400 回答