2

我有一系列“消息”要从移动客户端发送到服务器应用程序。每条消息都有一些公共信息(MAC、时间戳等),它的 SoObjMessage是具有 aMessageInfo和一个类的基类TransactionInfo,然后我有 aObjReqMsg1ObjReqMsg2一个不同的 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)我的想法是只发出一个带有 , 的请求,而不是发送十个ObjReqMsg1请求,List<ObjReqMsg1>以节省网络呼叫。它有效并且实际上节省了一些时间,这有意义吗?或者打 10 个电话会更正确?

2)然后,如果它是有意义的并且是正确的路径,我认为它会很好,而不是进行两次List<ObjReqMsg1>List<ObjReqMsg2>调用,进行一次List<ObjMessage>调用,并在服务器上检查每个ObjMessage是否是ObjReqMsg1or ObjReqMsg2,然后执行相应的操作。是可行的?

如果是,我做错了什么,因为,当我创建一个List<ObjMessage>添加 3ObjReqMsg1和 3 ObjReqMsg2,并与检查员检查intValue并且stringValue存在时,当我这样做时:

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

我没有找到intValuestringValue序列化。

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

你能帮我吗?谢谢

4

2 回答 2

2

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

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

重新“强制转换并采取相应的行动” - 你也可以考虑多态性,即一个virtualorabstract方法和can 。然后你什么都不用做;你只要打电话。ObjMessageObjReqMsg1ObjReqMsg2overrideobj.TheMethod(args)

于 2013-05-24T12:22:19.687 回答
0

您应该考虑为客户使用变体(即联合)以更好地预期可能的数据可变性。否则,您的客户将与服务耦合。

于 2013-05-24T16:50:56.557 回答