1

冒着违反礼仪的风险(如果这不恰当,我很抱歉),我喜欢提出这个问题,因为它已经飘荡了一段时间,没有一个答案。作为 Protobuf-net 库的一部分,我相信这实际上是一个更严重的错误(如果事实证明不是,我愿意道歉一千次):

尝试反序列化作为 DynamicType 对象一部分的值类型时,我仍然遇到上述错误。以下是用于序列化/反序列化的方法以及正在序列化和反序列化的特定类以及一些简单的测试代码:

[ProtoContract]
public class ZmqMessage
{
    [ProtoMember(1)]
    public ZmqMessageType MessageType { get; set; }
    [ProtoMember(2, DynamicType = true)]
    public object MessageBody { get; set; }

    public ZmqMessage()
    { }

    public ZmqMessage(ZmqMessageType zmqMessageType, object messageBody)
    {
        this.MessageType = zmqMessageType;
        this.MessageBody = messageBody;
    }
}



public static class ProtoBuf
{
    public static byte[] Serialize<T>(T serializeThis)
    {
        using (var stream = new MemoryStream())
        {
            Serializer.Serialize<T>(stream, serializeThis);
            return stream.GetBuffer();
        }
    }

    public static T Deserialize<T>(byte[] byteArray)
    {
        using (var stream = new MemoryStream(byteArray))
        {
            return Serializer.Deserialize<T>(stream);
        }
    }
}

这里有一些测试用例:

ZmqMessage testMessage = new ZmqMessage(ZmqMessageType.ControlMessage, "Test");
byte[] byteMessage = ProtoBuf.Serialize<ZmqMessage>(testMessage);
ZmqMessage deserializedMessage = ProtoBuf.Deserialize<ZmqMessage>(byteMessage);

ZmqMessage testMessage = new ZmqMessage(ZmqMessageType.ControlMessage, (int) 1);
byte[] byteMessage = ProtoBuf.Serialize<ZmqMessage>(testMessage);
ZmqMessage deserializedMessage = ProtoBuf.Deserialize<ZmqMessage>(byteMessage);

第一个 testMessage 反序列化很好,而第二个(在 messageBody 中使用 int)抛出错误消息。

在此处输入图像描述

4

1 回答 1

0

解决了这个问题,我忘记了我必须将子类标记为 [ProtoContract] 及其成员也标记为 [ProtoMembers(n)],即使将它们传递给“DynamicType”也是如此。请注意 Marc Gravell 上面关于动态类型和继承的评论。

这不是一个错误,我很抱歉建议它作为一种可能性。

于 2012-08-02T07:33:10.910 回答