2012-05-09 57 views
1

我試圖使用protobuf-net發送一個類(稱爲RPCMessage),其中包含另一個自定義類(稱爲MessageArguments)的列表。我擴展MessageArguments有一個不同的類,基於我希望參數是什麼值類型(在這種情況下是一個浮點數)。我得到了follwing異常:ArgumentNullException:已知類型不能爲空。如果有幫助,我正在使用.Net 3.5。Protobuf-Net ArgumentNullException

代碼以連載:

[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; 
    } 
} 

存儲消息參數的代碼:存儲消息

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 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); 

我知道我可能失去了一些東西基本的,但我不能爲我的生活工作是什麼

+0

從異常堆棧跟蹤的任何機會? –

回答

0

我沒有足夠充分攝製,但一些觀察:

  • [ProtoInclude]代表繼承層次結構;這是不可能的FloatArgument從兩個MessageArgumentRPCMessage得來,所以我會假設(通過命名)上RPCMessage包含不正確,並應被刪除
  • ,因爲你正在使用object,您不能使用通用API ;嘗試,而不是:

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

這再序列和克隆成功。