Protobuf-Net ArgumentNullException

时间:2012-05-09 04:57:41

标签: protobuf-net

我试图使用protobuf-net发送一个类(称为RPCMessage),其中包含另一个自定义类(称为MessageArguments)的列表。我已经将MessageArguments扩展为根据我希望参数的值类型(在本例中为float)而具有不同的类。我得到了以下异常: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);

我知道我可能遗漏了一些基本的东西,但我不能为我的生活找出那些是什么

1 个答案:

答案 0 :(得分:0)

我没有足够的重复,但有些观察:

  • [ProtoInclude]表示继承层次结构; FloatArgument MessageArgumentRPCMessage都不可能RPCMessage,因此我会假设(通过命名)object上的包含不正确并应删除
  • 因为您使用的是Serializer.NonGeneric.SerializeWithLengthPrefix(memStream, serializableObject, PrefixStyle.Base128, 1); ,所以您无法使用通用API;试着改为:

    {{1}}

然后成功序列化和克隆。