protobuf-net:如何序列化一个EventHandler

4

我正在尝试使用protobuf-net对一个包含EventHandler的类进行序列化,使用以下代码:

    [ProtoContract]
    class Thing
    {
        [ProtoMember(5, AsReference = true)]
        public EventHandler _DoSomething;

        public event EventHandler DoSomething
        {
            add { _DoSomething += value; }
            remove { _DoSomething -= value; }
        }

        public void PerformSomething(object sender, EventArgs args)
        {
        }
    }

    [TestMethod]
    public void SerializingAClassWithAnEvent_Deserializes()
    {
        var Guy1 = new Thing() {};
        var Guy2 = new Thing() {};
        Guy2.DoSomething += Guy1.PerformSomething;
        Assert.IsNotNull(Guy2._DoSomething);

        MemoryStream buffer = new MemoryStream();
        Serializer.Serialize(buffer, Guy2);
        MemoryStream afterStream = new MemoryStream(buffer.ToArray());
        var outGuy = Serializer.Deserialize<Thing>(afterStream);

        Assert.IsNotNull(outGuy._DoSomething);
    }

这段代码可以编译和运行,但第二个断言失败了,因为_DoSomething事件处理程序仍然为null。我错过了什么?


2
据我所知,事件处理程序无法序列化。它是null,因为没有处理程序附加到新实例上。 - user111013
你想要达成什么目标?Will Hughes 在他的评论中是正确的。 - Mats Magnem
1
我可以确认(作为库的作者),MBen的答案是正确的。委托不被支持或可支持。基本上,这只对远程/ BinaryFormatter真正有意义。大多数序列化器(XmlSerializer,DataContractSerializer,JSON.NET,protobuf-net等)不支持委托。 - Marc Gravell
1个回答

4
根据这里的文档,不支持事件处理程序。
custom classes that:
   are marked as data-contract;
   have a parameterless constructor;
   for Silverlight: are public
many common primitives etc
single dimension arrays: T[]
List<T> / IList<T>
Dictionary<TKey,TValue> / IDictionary<TKey,TValue>
any type which implements IEnumerable<T> and has an Add(T) method

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接