这个不可用的对象在哪里?
-
24-10-2019 - |
题
我正在尝试序列化对象,并抛出以下序列化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;
尝试一次序列化对象(单个类型),然后查看何时爆炸。您可以手动或通过反射执行此操作。
不隶属于 StackOverflow