1

我试图使用 protobuf-net 发送一个类(称为 RPCMessage),其中包括另一个自定义类(称为 MessageArguments)的列表。我已经根据我希望参数的值类型(在本例中为浮点数)扩展了 MessageArguments 以具有不同的类。我收到以下异常:ArgumentNullException:已知类型不能为空。如果有帮助,我正在使用 .Net 3.5。

序列化代码:

public static void EncodeMessage(MessageType messageType, object messageClass, ref NetOutgoingMessage outMessage){
    byte[] serialised;

    var serializableObject = messageClass as RPCMessage;
    var memStream = new MemoryStream();
    Serializer.SerializeWithLengthPrefix(memStream, serializableObject,
    PrefixStyle.Base128);       
}

存储消息的代码:

[Serializable,
ProtoContract,
ProtoInclude(3, typeof(FloatArgument))]
public class RPCMessage {
    [ProtoMember(1)]
    public byte code;
    [ProtoMember(2)]
    public List<MessageArgument> args;

    public RPCMessage(){}

    public RPCMessage (byte _code, List<MessageArgument> _args){
        code = _code;
        args = _args;
    }
}

存储消息参数的代码:

[Serializable,
ProtoContract,
ProtoInclude(3, typeof(FloatArgument)))]
public class MessageArgument{
    [ProtoMember(1)]
    public byte id; 

    public MessageArgument(){}

    public MessageArgument(byte _id){
        id = _id;
    }
}

最后,由

List<MessageArgument> args = new List<MessageArgument>();
args.Add(new FloatArgument(0, 1f));
MessageParser.EncodeMessage(type, new RPCMessage(0, args), ref outMessage);

我知道我可能遗漏了一些基本的东西,但我一生都无法弄清楚那是什么

4

1 回答 1

0

我没有足够的能力来完全复制,但有一些观察:

  • [ProtoInclude]表示继承层次结构;不可能同时从andFloatArgument派生,因此我将假设(通过命名)包含 on是不正确的,应该删除MessageArgumentRPCMessageRPCMessage
  • 由于您使用的是object,因此您不能使用通用 API;改为尝试:

    Serializer.NonGeneric.SerializeWithLengthPrefix(memStream,
         serializableObject, PrefixStyle.Base128, 1);
    

这然后成功地序列化和克隆。

于 2012-05-09T09:39:23.053 回答