发送异构对象列表

时间:2013-05-24 11:01:54

标签: servicestack protobuf-net

我有一系列“消息”要从移动客户端发送到服务器应用程序。 每条消息都有一些共同的信息(MAC,时间戳等)及其 所以ObjMessage是具有MessageInfoTransactionInfo类的基类,然后我有一个ObjReqMsg1ObjReqMsg2,它们对于int和string属性不同,只是为了测试。

//消息传递类

[ProtoContract]
public class MessageInfo
{
    [ProtoMember(1)]
    public string MAC { get; set; }
    [ProtoMember(2)]
    public string version { get; set; }
    [ProtoMember(3)]
    public Guid guidMessage { get; set; }
    [ProtoMember(4)]
    public DateTime timeGenerated { get; set; }
}

[ProtoContract]
public class TransactionInfo
{
    [ProtoMember(1)]
    public string user1 { get; set; }
    [ProtoMember(2)]
    public string user2 { get; set; }
    [ProtoMember(3)]
    public DateTime timeOperation { get; set; }
}


[ProtoContract]
public class ObjMessage
{
    [ProtoMember(1)]
    public TransactionInfo transactionInfo { get; set; }
    [ProtoMember(2)]
    public MessageInfo messageInfo { get; set; }
}

//不同消息的列表

[ProtoContract]
public class ObjReqMsg1 : ObjMessage
{
    [ProtoMember(1)]
    public int intValue { get; set; }
}

[ProtoContract]
public class ObjReqMsg2 : ObjMessage
{
    [ProtoMember(1)]
    public string stringValue { get; set; }
}


[ProtoContract]
public class ReqListMessages : IReturn<RespListMessages>
{
    [ProtoMember(1)]
    public List<ObjMessage> objsReqMessage { get; set; }
}

我的所有测试都是使用json和协议缓冲区完成的,并且发送异构消息列表的单个消息可以正常工作。

我的问题是: 1)我的想法,而不是发送10个ObjReqMsg1请求,只是使用List<ObjReqMsg1>发出一个请求,以节省网络呼叫。它有效,它实际上节省了一些时间,是否有意义?或者拨打10个电话会更正确吗?

2)然后,如果它是有道理的并且是正确的路径,我认为这不是进行两次List<ObjReqMsg1>List<ObjReqMsg2>调用,而是进行一次List<ObjMessage>调用,并在服务器上检查每个ObjMessageObjReqMsg1还是ObjReqMsg2,投票并采取相应行动。是否可行?

如果是,我做错了什么,因为,当我创建List<ObjMessage>添加3 ObjReqMsg1和3 ObjReqMsg2时,并与检查员核实intValue和当我这样做时,会出现stringValue

string serialized = ServiceStack.Text.JsonSerializer.SerializeToString<ReqListMessages>(reqListMessage);

我没有找到intValuestringValue序列化。

显然,在服务器端,我收到了6个ObjMessage的列表,而不是3 ObjReqMsg1 + 3 ObjReqMsg2的列表。

你能帮忙吗? 感谢

2 个答案:

答案 0 :(得分:2)

1:在大多数API场景中,发送较少的chunkier请求通常是提高性能的最简单方法; “它是否有意义”取决于上下文,但如果它对你有意义那么:可能

2:将[ProtoInclude(5, typeof(ObjReqMsg1))][ProtoInclude(6, typeof(ObjReqMsg2))]添加到class ObjMessage声明中,然后重试。

重新“投射并采取相应的行动” - 您也可以考虑多态性,即virtual上的abstractObjMessage ObjReqMsg1ObjReqMsg2 override。那你就什么都不做;你只需致电obj.TheMethod(args)

答案 1 :(得分:0)

您应该考虑为客户使用变体(即union)来更好地预期可能的数据变化。否则,您的客户将加入该服务。