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

类型'system.linq.sthumerable+d__71`1 [[System.String,mscorlib,版本= 4.0.0.0,culture =中性,publicKeytoken = b77a5c561934e089]]中性,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;

尝试一次序列化对象(单个类型),然后查看何时爆炸。您可以手动或通过反射执行此操作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top