附加事件时执行DeepCopy(克隆)

时间:2010-10-27 02:39:56

标签: .net events serialization

如果有一个提供事件的对象并且使用深度克隆(序列化)方法来克隆对象,那么当对象上有实际附加的事件时,如何做到这一点。

如果我的对象声明了一个事件,但没有附加任何内容,则可以毫无问题地克隆对象。

但如果对象附加了事件,则序列化失败。 所有关联的类都应用了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行

1 个答案:

答案 0 :(得分:0)

[field: NonSerialized]添加到事件声明中。