2013-05-24 2 views
2

У меня есть серия сообщений, отправляемых на серверное приложение от мобильного клиента. Каждое сообщение имеет некоторую общую информацию (MAC, метки времени и т.д.) и его Так ObjMessage является базовым классом, который имеет MessageInfo и TransactionInfo класс, то у меня есть ObjReqMsg1 и ObjReqMsg2, которые различаются для ИНТ и свойстве строки, только для тестирования ,Отправка списка гетерогенных объектов

// Сообщения классов

[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 и протокольными буферами, и отправка отдельных сообщений из списков eterogeneous сообщений работает.

Мои вопросы: 1) моя идея, вместо того чтобы отправить десять ObjReqMsg1 запросов, чтобы сделать только один запрос с List<ObjReqMsg1>, чтобы сэкономить на сетевых вызовов. Это работает, и на самом деле это экономит время, это имеет смысл? Или было бы правильнее сделать 10 звонков?

2) Тогда, если это имеет смысл, и это правильный путь, я думал, что это было бы здорово, вместо того, чтобы сделать два List<ObjReqMsg1> и List<ObjReqMsg2> вызовов, чтобы сделать один List<ObjMessage> вызов, и на чеке сервера, если каждый ObjMessage является ObjReqMsg1 или ObjReqMsg2, литые и действующие соответственно. Возможно ли это?

Если это то, что я делаю неправильно, потому что, когда я создаю List<ObjMessage> добавление 3 ObjReqMsg1 и 3 ObjReqMsg2, и проверки с инспектором, что intValue и stringValue присутствуют, когда я делаю:

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

Я не нашел intValue и stringValue сериализован.

И, очевидно, на стороне сервера я получаю список из 6 ObjMessage, а не список из 3 ObjReqMsg1 + 3 ObjReqMsg2.

Вы можете помочь?

ответ

2

1: в большинстве сценариев API отправка меньших запросов chunkier обычно является самым простым способом повышения производительности; «Имеет смысл» зависит от контекста, но если это имеет смысл вам то: вероятно

2: добавить [ProtoInclude(5, typeof(ObjReqMsg1))] и [ProtoInclude(6, typeof(ObjReqMsg2))]class ObjMessage в декларации, и повторите попытку.

Re «слепок и действовать соответствующим образом», - вы могли бы также рассмотреть полиморфизм, т.е. virtual или abstract метод на ObjMessage что ObjReqMsg1 и ObjReqMsg2 может override. Тогда вам не нужно ничего делать; вы просто вызываете obj.TheMethod(args).

+0

спасибо, добавив, что ProtoInclude сделал работу eveything, с protobuf. Но пытаясь заставить его работать и с сериализатором json sericestack, я нашел много ответов о мифах, которые отговаривают мой подход (DTO не определены), поэтому я, вероятно, поеду с DTO со списком и списком вместо одиночный Список . –

0

Вам следует рассмотреть возможность использования варианта (i.e union) для клиентов, чтобы лучше ожидать возможную изменчивость данных. В противном случае ваши клиенты будут подключены к сервису.

Смежные вопросы