如何将C#对象列表转换为协议缓冲区列表?

Har*_*lla 7 c# protocol-buffers .net-core google-protocol-buffer asp.net-core-2.1

我正在尝试获取我的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; }
  }
Run Code Online (Sandbox Code Playgroud)

protobuf的

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

message CandidateList{
      repeated Candidate candidateList = 1;
}
Run Code Online (Sandbox Code Playgroud)

列表功能(这是不完整的)

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

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

            }
         }
          return ;
      }   
   }
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 5

我可能误解了这里的问题,所以请随时纠正我误解的任何部分。

如果我们使用 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; }
  }
Run Code Online (Sandbox Code Playgroud)

然后假设您已经在 a 中有数据Stream(如果使用byte[],则 aMemoryStream将起作用):

var userList = Serializer.Deserialize<List<UserDTO>>(source);
Run Code Online (Sandbox Code Playgroud)

会给你一个List<UserDTO>,(正确)假设每个元素都是一个repeated Candidatewith field 1。如果你想让我更具体,你可以通过 code-gen 运行整个原型模式来获取完整的模式 - 例如通过 protobuf-net 的protogen. 点击“生成”,您将获得一个CandidateList表示根对象的附加元素(而不是隐式的)。然后你会使用:

var root = Serializer.Deserialize<CandidateList>(source);
var userList = root.candidateLists;
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,使用相同的方法SerializeDeserialize从输入生成 protobuf 数据。