如何将 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; }
  }

普罗托布夫

 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 ;
      }   
   }

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

如果我们使用 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>,做出(正确的)假设每个元素都是一个具有场1repeated Candidate。如果你想让我更具体,你可以通过代码生成运行整个原型模式来获取完整的模式 - 例如通过 protobuf-net 的protogen。点击"生成",您将获得一个表示根对象(而不是隐式)的附加CandidateList元素。然后,您将使用:

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

在这两种情况下,使用Serialize而不是Deserialize的相同方法都可以从输入生成protobuf数据。

最新更新