次のオブジェクトを逆シリアル化すると、「逆シリアル化中に参照追跡オブジェクトが参照を変更しました」というエラーが発生します。
[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);
}
}
}
ここで何か間違っていますか?ありがとう
EDIT1: ZmqMessage オブジェクトの MessageBody で "Test" などの文字列を送信すると、エラーが発生しないことがわかりました。ただし、 (int) 1 または単に 1 などの int を送信すると、上記のエラーがスローされます。
EDIT2:これは、問題を示す列挙型と簡単なテスト ケースです。
public enum ZmqMessageType
{
RawByteArray = 5550,
ControlMessage = 5551
}
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);