gRPC Contract First模式下Proto自动生成C#对象如何转自定义C#对象
gRPC Contract First模式下Proto自动生成C#对象转自定义C#对象的实现方案
可以实现,共有三类常见实现方式,可根据自身场景选择:
1. 手动映射(推荐用于字段少的场景)
性能最高,无额外依赖,直接赋值即可,注意gRPC自动生成的C#类属性默认采用帕斯卡命名(首字母大写):
HelloRep hello = new HelloRep { message = reply.Message };
2. 借助对象映射库(推荐用于多类转换、字段多的场景)
如果项目中已经引入AutoMapper这类对象映射工具,可直接配置映射规则,框架会自动匹配名称近似的字段,无需逐行写赋值逻辑:
映射规则配置
public class GrpcMappingProfile : Profile { public GrpcMappingProfile() { // 配置HelloReply到HelloRep的映射规则 CreateMap<HelloReply, HelloRep>(); } }
转换代码
// ASP.NET Core 中可在服务注册时注入AutoMapper builder.Services.AddAutoMapper(typeof(GrpcMappingProfile)); // 调用转换 HelloRep hello = _mapper.Map<HelloRep>(reply);
3. Protobuf序列化反序列化转换(你需要的类似Serializer.Deserialize的实现)
如果两个类的Protobuf结构完全一致,可通过序列化-反序列化的方式直接转换,不需要写映射规则,注意自定义类需要加上Protobuf相关特性:
先修改自定义类的特性
[ProtoContract] class HelloRep { [ProtoMember(1)] string message { get; set; } }
转换代码
using var memoryStream = new MemoryStream(); // 序列化gRPC返回的原生对象 Serializer.Serialize(memoryStream, reply); memoryStream.Seek(0, SeekOrigin.Begin); // 反序列化为自定义对象 HelloRep hello = Serializer.Deserialize<HelloRep>(memoryStream);
内容的提问来源于stack exchange,提问作者janith
相关产品推荐
相关产品推荐

