这个不可序列化的对象在哪里?

时间:2011-03-16 01:56:55

标签: .net serialization .net-4.0 serializable binary-serialization

我正在尝试序列化一个对象,并抛出以下SerializationException:

  

在Assembly'System.Core中输入'System.Linq.Enumerable + d__71`1 [[System.String,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]]',版本= 4.0.0.0 ,Culture = neutral,PublicKeyToken = b77a5c561934e089'未标记为可序列化。

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

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:4)

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

当你有这样的方法时:

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

编译器将其转换为嵌套对象,其名称与您所看到的名称相似(由于嵌入式+而导致您自己永远无法创建名称的对象)

如果您将此对象的引用存储在您尝试序列化的内容中,您将获得OP注意到的异常。

“修复”是为了确保您的序列化对象始终转换任何IEnumerable&lt;&gt;分配到列表中。而不是这个

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;

答案 2 :(得分:-1)

尝试一次序列化对象(单一类型)并查看它何时爆炸。您可以手动或通过反射来完成此操作。