所以我使用命令将变量保存到序列化文件中。我保存了以下数据:
data.Save("ships", this.ships.Select(x => x.Name));
这应该输出一个IEnumerable,但它似乎输出了一些不同的东西,我猜这是与Lambda的懒惰初始化?错误是:
Type 'System.Linq.Enumerable+WhereSelectListIterator`2[[~~~],[~~~]]' in Assembly '~~~' is not marked as serializable.
错误是由this.ships
是non-serializable
类型的事实引起的,与类型字符串的.Name
的返回相比较。
所以我希望我能找到如何让它恢复真正的价值?
我已经意识到添加.ToList()
会有效,但我对整洁的解决方案感到好奇。
答案 0 :(得分:2)
System.Linq.Enumerable.WhereSelectListIterator<TSource, TResult>
确实实现了IEnumerable<TResult>
,正如您所知,它不是可序列化的。
WhereSelectListIterator
存储源和查询定义,并允许您的查询是惰性的,这意味着它在您需要结果时进行评估,而不是在创建查询时进行评估。
如果要序列化查询结果,则必须强制进行评估。 ToList()
或ToArray
都可以正常使用。
data.Save("ships", this.ships.Select(x => x.Name).ToList());
为了确保以后不会发生此类错误,您可以考虑将Save
方法定义更改为使用ICollection<T>
而不是IEnumerable<T>
。