Как преобразовать список объектов C # в список буферов протокола? - PullRequest
0 голосов
/ 22 января 2019

Я пытаюсь получить список моих объектов userDTO и преобразовать его в список кандидатов protobuf, но я не могу понять, как это сделать

C # объект

public class UserDTO
  {
    public string UserNumber { get; set; }
    public string FirstName { get; set; }
    public string LastName  { get; set; }
    public string UserId { get; set; }
    public string EmailId { get; set; }
  }

Protobuf

 message Candidate {
     string userNumber = 1;
     string userId = 2;
     string firstName = 3;
     string lastName = 4;
     string emailId = 5;
    }

message CandidateList{
      repeated Candidate candidateList = 1;
}

Функция списка (это не полностью)

 public CandidateList GetUsersRpc()
     {                  
    List<UserDTO> userList = _repository.GetUsersRpc();

       if (userList.Count > 0)
        {
        foreach (var user in userList)
            {

            }
         }
          return ;
      }   
   }

1 Ответ

0 голосов
/ 22 января 2019

Возможно, я здесь неправильно понял вопрос, поэтому не стесняйтесь поправлять меня в любых частях, которые я неправильно понял.

Если мы используем protobuf-net (я просто цитирую это из-за знакомства и удобства), то будет работать следующее:

  [ProtoContract]
  public class UserDTO
  {
    [ProtoMember(1)]
    public string UserNumber { get; set; }
    [ProtoMember(3)]
    public string FirstName { get; set; }
    [ProtoMember(4)]
    public string LastName  { get; set; }
    [ProtoMember(2)]
    public string UserId { get; set; }
    [ProtoMember(5)]
    public string EmailId { get; set; }
  }

, тогда предположим, что у вас уже есть данные в Stream (при использовании byte[], MemoryStream будет работать):

var userList = Serializer.Deserialize<List<UserDTO>>(source);

даст вам List<UserDTO>, делая (правильное) предположение, что каждый элемент является repeated Candidate с полем 1. Если вы хотите получить более конкретную информацию, вы можете запустить всю прототипную схему через code-gen, чтобы получить полную схему - например, через protogen protobuf-net. Нажмите «Создать», и вы получите дополнительный элемент CandidateList, который представляет корневой объект (а не неявный). Тогда вы будете использовать:

var root = Serializer.Deserialize<CandidateList>(source);
var userList = root.candidateLists;

В обоих случаях один и тот же подход с Serialize вместо Deserialize будет работать для генерации протобуф данных из ввода.

...