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

8

我试图获取我的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个回答

4

如果我对问题的理解有误,请随时纠正我。

如果我们使用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。如果您想更加具体,可以通过代码生成运行整个proto模式以获取完整模式 - 例如通过protobuf-net的protogen。点击“生成”按钮,您将获得另一个CandidateList元素,表示根对象(而不是隐含的)。然后您将使用:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接