【问题标题】:Sending a List of heterogeneous objects发送异构对象列表
【发布时间】:2013-05-24 11:01:54
【问题描述】:

我有一系列“消息”要从移动客户端发送到服务器应用程序。 每条消息都有一些公共信息(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) 我的想法不是发送十个ObjReqMsg1 请求,而是只发出一个带有List&lt;ObjReqMsg1&gt; 的请求,以节省网络呼叫。它有效并且实际上节省了一些时间,这有意义吗?还是打 10 次电话更正确?

2) 然后,如果它有意义并且是正确的路径,我认为与其进行两次List&lt;ObjReqMsg1&gt;List&lt;ObjReqMsg2&gt; 调用,不如进行一次List&lt;ObjMessage&gt; 调用,然后在服务器上检查会更好如果每个 ObjMessageObjReqMsg1ObjReqMsg2 ,则进行相应的转换和操作。是否可行?

如果是,我做错了什么,因为当我创建一个 List&lt;ObjMessage&gt; 添加 3 个 ObjReqMsg1 和 3 个 ObjReqMsg2,并与检查员检查 intValuestringValue 是否存在时,我做:

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

我没有找到序列化的intValuestringValue

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

你能帮忙吗? 谢谢

【问题讨论】:

    标签: servicestack protobuf-net


    【解决方案1】:

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

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

    重新“强制转换并采取相应措施” - 您还可以考虑多态性,即 ObjMessage 上的 virtualabstract 方法 ObjReqMsg1ObjReqMsg2 可以 override。然后你什么都不用做;你只需拨打obj.TheMethod(args)

    【讨论】:

    • 谢谢,使用 protobuf 添加 ProtoInclude 使一切正常工作。但是试图使它也与 servicestack json 序列化程序一起工作,我发现了许多不鼓励我的方法的神话的答案(DTO 没有明确定义),所以我可能会使用带有 List 和 List 的 DTO而不是单个 List.
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多