2012-05-09 9 views
1

protobuf-netを使用して別のカスタムクラス(MessageArgumentsと呼ばれる)のリストを含むRPCMessageというクラスを送信しようとしています。 MessageArgumentsを拡張して、引数の値の型(この場合はfloat)を希望する別のクラスを持つように拡張しました。次の例外が発生します。ArgumentNullException:既知の型を空白にすることはできません。私はそれが役立ちます.Net 3.5を使用しています。Protobuf-Net ArgumentNullException

シリアライズするコード:店のメッセージに

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

私はおそらく基本的な何かが欠けている知っているが、私の人生は、それは私が完全にREPROするのに十分なを持っていない

+0

例外からスタックトレースが発生する可能性はありますか? –

答えて

0

が何であるかを考え出すために、私はカントが、いくつかの所見:

  • [ProtoInclude]は継承階層を表します。それはFloatArgumentMessageArgumentRPCMessageの両方に由来することは不可能であるので、私はあなたがobjectを使用しているので、RPCMessageに含めることが間違っていると
  • を削除する必要があること(命名による)と仮定します、あなたは一般的なAPIを使用することはできません;代わりにしてみてください:

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

これは、その後、正常シリアライズおよびクローン。

関連する問題