我试图确定使用以下序列化代理来启用匿名函数/委托/ lambdas的序列化可能导致什么问题.
// see http://msdn.microsoft.com/msdnmag/issues/02/09/net/#S3
class NonSerializableSurrogate : ISerializationSurrogate
{
public void GetObjectData(object obj, SerializationInfo info, StreamingContext context)
{
foreach (FieldInfo f in obj.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic))
info.AddValue(f.Name, f.GetValue(obj));
}
public object SetObjectData(object obj, SerializationInfo info, StreamingContext context,
ISurrogateSelector selector)
{
foreach (FieldInfo f in obj.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic))
f.SetValue(obj, info.GetValue(f.Name, f.FieldType));
return obj;
}
}
Run Code Online (Sandbox Code Playgroud)
清单1 改编自 Counting Demo
我可以想到的主要问题可能是一个问题是匿名类是内部编译器细节,并且它的结构不能保证在.NET Framework的修订版之间保持不变.我很确定这是基于我对迭代器的类似问题的研究.
我正在调查匿名函数的序列化.我期待这不起作用,但发现它确实在某些情况下.只要lambda没有&强制编译器生成匿名类,一切正常.
如果编译器需要生成的类来实现匿名函数,则抛出SerializationException.这是因为编译器生成的类未标记为可序列化.
namespace Example
{
[Serializable]
class Other
{
public int Value;
}
[Serializable] …
Run Code Online (Sandbox Code Playgroud)