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 は正常に逆シリアル化されますが、2 番目 (messageBody で int を使用) は上記のエラー メッセージをスローします。

ここに画像の説明を入力

4

1 に答える 1

0

問題を解決しました。サブクラスを [ProtoContract] としてマークし、そのメンバーを [ProtoMembers(n)] としてマークする必要があることを忘れていました。動的型と継承に関する上記の Marc Gravell のコメントに注意してください。

これはバグではありませんでした。

于 2012-08-02T07:33:10.910 に答える