如果有一个提供事件的对象并且使用深度克隆(序列化)方法来克隆对象,那么当对象上有实际附加的事件时,如何做到这一点。
如果我的对象声明了一个事件,但没有附加任何内容,则可以毫无问题地克隆对象。
但如果对象附加了事件,则序列化失败。 所有关联的类都应用了Serializable属性(Form1除外,它用于测试)。
因此,在下面的示例中,如果我调用Create(true)
,则克隆失败(请参阅最后的异常)。
如果我致电Create(false)
,那么它可以正常运作
示例代码是设计的,但希望它能证明我正在尝试做的事情。
private void Create(bool useEvent)
{
mRab = new Rabbits();
if (useEvent) mRab.Changed += new Rabbits.ChangedEventHandler(ChangedRabbits);
Rabbit r;
r = new Rabbit();
r.Monkeys.Add(new Monkey("Test"));
mRab.Add(r);
Rabbits r2;
r2 = DeepClone(mRab);
}
public static T DeepClone<T>(T obj)
{
using (var ms = new MemoryStream())
{
var f = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
f.Serialize(ms, obj);
ms.Position = 0;
return (T)f.Deserialize(ms);
}
}
附加事件时克隆时的异常。 System.Runtime.Serialization.SerializationException:在程序集'CSharpClonetest中输入'CSharpClonetest.Form1',Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'未标记为可序列化。 在System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType类型) 在System.Runtime.Serialization.FormatterServices.GetSerializableMembers(Type type,StreamingContext context) 在System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo() 在System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Object obj,ISurrogateSelector surrogateSelector,StreamingContext context,SerObjectInfoInit serObjectInfoInit,IFormatterConverter converter,ObjectWriter objectWriter) 在System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.Serialize(Object obj,ISurrogateSelector surrogateSelector,StreamingContext context,SerObjectInfoInit serObjectInfoInit,IFormatterConverter converter,ObjectWriter objectWriter) 在System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Write(WriteObjectInfo objectInfo,NameInfo memberNameInfo,NameInfo typeNameInfo) at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph,Header [] inHeaders,__BinaryWriter serWriter,Boolean fCheck) 在System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream,Object graph,Header [] headers,Boolean fCheck) 在System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream,Object graph) 在C:\ Development \ Spikes \ TestDeepCloneEvent \ CSharpClonetest \ Form1.cs中的CSharpClonetest.Form1.DeepClone [T](T obj):第30行
答案 0 :(得分:0)
将[field: NonSerialized]
添加到事件声明中。