我有一系列要从移动客户端发送到服务器应用程序的"消息"。每条消息都有一些共同的信息(MAC,时间戳等)和它的因此,ObjMessage
是具有MessageInfo
和TransactionInfo
类的基类,然后我有ObjReqMsg1
和ObjReqMsg2
,它们对于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
是否为ObjReqMsg1
或ObjReqMsg2
, cast并采取相应的行动。这可行吗?
如果是,我做错了什么,因为,当我创建一个List<ObjMessage>
添加3 ObjReqMsg1
和3 ObjReqMsg2
,并与检查器检查intValue
和stringValue
存在时,当我这样做:
string serialized = ServiceStack.Text.JsonSerializer.SerializeToString<ReqListMessages>(reqListMessage);
我没有找到intValue
和stringValue
序列化。
显然,在服务器端,我收到6个ObjMessage
的列表,而不是3个ObjReqMsg1
+ 3个ObjReqMsg2
的列表。
你能帮忙吗?由于
1:在大多数API场景中,发送更少的块请求通常是提高性能的最简单方法;"does it make sense"取决于上下文,但如果它对你有意义那么:可能
2:将[ProtoInclude(5, typeof(ObjReqMsg1))]
和[ProtoInclude(6, typeof(ObjReqMsg2))]
添加到class ObjMessage
声明中,然后重试
重新"cast and act相应地"-你也可以考虑多态性,即ObjMessage
上的virtual
或abstract
方法,ObjReqMsg1
和ObjReqMsg2
可以override
。然后你什么都不用做;你只需调用obj.TheMethod(args)
您应该考虑为客户端使用变体(即联合),以便更好地预期可能的数据可变性。否则,您的客户端将被耦合到服务。