Как преобразовать список объектов C# в список буферов протокола?

Я пытаюсь получить список своих объектов 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 ответ

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

Если мы используем 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, чтобы получить полную схему - например, через protobuf-net. protogen, Нажмите "Создать", и вы получите дополнительный CandidateList элемент, который представляет корневой объект (а не неявный). Тогда вы бы использовали:

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

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

Другие вопросы по тегам