我正在尝试使用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);我知道我可能遗漏了一些基本的东西,但我无论如何也搞不清楚那是什么
发布于 2012-05-09 17:39:23
我没有足够的资料来完整地再现,但我有一些观察:
[ProtoInclude]代表继承层次结构;FloatArgument不可能同时从MessageArgument和RPCMessage派生,所以我假设(通过命名) RPCMessage上的包含是不正确的,应该从object,因此不能使用通用API;请尝试:Serializer.NonGeneric.SerializeWithLengthPrefix(memStream,serializableObject,PrefixStyle.Base128,1);
然后,这将成功地序列化和克隆。
https://stackoverflow.com/questions/10510081
复制相似问题