エチケットに違反する危険を冒して (それが不適切である場合は申し訳ありません)、この質問をぶつけたいと思います。これは、実際には 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 は正常に逆シリアル化されますが、2 番目 (messageBody で int を使用) は上記のエラー メッセージをスローします。