冒着违反礼仪的风险(如果不合适我道歉),我喜欢提出这个问题,因为它已经漂浮了一段时间没有一个答案。我相信这实际上是一个更严重的错误,作为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)抛出错误消息。