我正在尝试获取我的 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; }
}
原型(prototype)缓冲区
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>
,做出(正确的)假设每个元素都是 repeated Candidate
带字段 1
.如果你想让我更具体,你可以通过代码生成运行整个原型(prototype)模式以获得完整的模式 - 例如通过 protobuf-net 的 protogen
.点击“生成”,你会得到一个额外的 CandidateList
代表根对象的元素(而不是隐含的)。然后你会使用:
var root = Serializer.Deserialize<CandidateList>(source);
var userList = root.candidateLists;
在这两种情况下,与 Serialize
相同的方法而不是 Deserialize
将根据输入生成 protobuf 数据。
关于c# - 如何将 C# 对象列表转换为 Protocol Buffer 列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54303495/