Entrada (esquema .proto)

Saída (C#)

O que esta ferramenta faz

Você tem um esquema Protocol Buffers e um serviço ou cliente C# que precisa dos DTOs correspondentes. O caminho oficial é instalar o protoc com o plugin de C# (ou ligar o Grpc.Tools ao seu .csproj) e deixar o MSBuild gerar as classes parciais durante o build. Isso funciona, mas é exagero quando você só quer ler o esquema, esboçar tipos ou colar uma mensagem numa página Razor ou numa integração pontual. Este conversor faz o mesmo tipo de trabalho — cola, copia, joga no Types.cs.

O mapeamento de tipos é do tipo chato porém certinho. string continua string (com inicializador = "" para projetos com nullable reference não reclamarem). bool, int32, int64, uint32, uint64, float, double mapeiam para bool, int, long, uint, ulong, float, double respectivamente. bytes vira byte[]. repeated T vira List<T>, map<K, V> vira Dictionary<K, V>, e wrappers conhecidos como google.protobuf.Timestamp são emitidos como string (a codificação JSON proto3 para timestamps é RFC 3339, ou seja, no fio é só uma string — veja a spec JSON proto3 se quiser os detalhes).

Os nomes dos campos passam pelo tratamento PascalCase padrão — order_idOrderId, shipping_addressShippingAddress — igual ao que a referência oficial protobuf C# gera. Valores de enum perdem o prefixo SCREAMING_SNAKE quando o esquema segue a convenção de prefixar cada valor com o nome do enum (então ORDER_STATUS_PENDING em enum OrderStatus vira OrderStatus.Pending). As classes de saída são planas — toda mensagem aninhada é içada para o nível superior, então você pode separar ou reorganizar sem precisar desembolar escopos. A conversão acontece inteira no seu navegador; nada do esquema é enviado para fora.

Como usar

Três passos. A saída sai pronta para compilar — cole num arquivo <code>Types.cs</code> do seu projeto.

1

Cole o esquema .proto

Jogue o esquema no editor da esquerda. syntax = "proto3"; no topo é opcional. O parser lida com blocos message aninhados, declarações de enum, oneof, map<K, V>, opções de campo e as diretivas habituais package/import/option. Imports são reconhecidos mas pulados, então cole inline qualquer tipo importado de que o esquema dependa.

A conversão de nomes de campo é automática: customer_name no .proto vira CustomerName em C#. Nomes de classe e enum ficam como estão (já em PascalCase por convenção).

2

Leia a saída

Na direita: declarações public class com auto-properties { get; set; } para cada mensagem, mais declarações public enum para cada enum. Uma linha using System.Collections.Generic; é adicionada quando o esquema usa campos repeated ou map (para resolver List e Dictionary). Jogue o arquivo num projeto, embrulhe no seu namespace e está pronto.

3

Conecte tudo

Para uso só como DTO, as classes já estão prontas para serializar com System.Text.Json ou Newtonsoft.Json. Para trabalho de verdade com gRPC em C# — implementação de serviço, streaming, deadlines — continue usando Grpc.Tools para os tipos de wire format e use este conversor para wrappers escritos à mão, camadas de mapeamento ou fixtures de teste ao lado do código gerado.

Quando isso realmente economiza tempo

Esboçar DTOs para um novo serviço gRPC

Você está começando um serviço gRPC em ASP.NET Core e quer ver como as mensagens vão ficar em C# antes de se comprometer com o Grpc.Tools. Cole o .proto, dê uma olhada nas classes, decida se a nomenclatura dos campos combina com o estilo do seu time e depois ligue a geração de código direito.

Camada de mapeamento escrita à mão

Seus tipos gRPC gerados moram no namespace deles e você quer DTOs simples para a camada de domínio. A saída daqui te dá classes limpas, sem o entulho de metadados do código gerado — fácil de mapear de ida e volta com AutoMapper ou conversores artesanais.

Revisar uma mudança em esquema Protobuf

Um colega adicionou campos numa mensagem num PR. Você quer ver o impacto na forma C# sem dar checkout na branch e rodar um build. Cole o esquema novo, faça diff com os tipos C# atuais e deixe um comentário de revisão focado.

Fixtures de teste e scripts rápidos

Você está escrevendo um script LinqPad pontual ou um app de console que faz POST num gRPC-gateway. Ligar a toolchain inteira do Protobuf por causa de 50 linhas de código de teste é exagero. Pegue as classes daqui, serialize em JSON, mande a requisição e siga em frente.

Perguntas frequentes

Meu esquema é enviado para algum lugar?

Não. O parser e o emissor de C# rodam inteiros no seu navegador, em JavaScript. Abra o DevTools e olhe a aba Network enquanto cola — zero requisições. Útil quando o seu esquema tem nomes de tipos internos, caminhos de pacote ou qualquer coisa que você não queira mandar para um serviço terceiro.

Essas classes funcionam com código gerado pelo Grpc.Tools?

Elas produzem formas equivalentes, mas não são idênticas byte a byte. O Grpc.Tools gera classes parciais, registros de parser, fiação de descriptor e tipos ancestrais a partir de Google.Protobuf.IMessage — nada disso aqui. Para trabalho real com o protocolo de fio do gRPC, use Grpc.Tools. Para código apenas de DTO (gateways JSON-over-HTTP, camadas de mapeamento, dados de teste), esta saída resolve.

Por que int64 e uint64 são tipados como long e ulong em vez de string?

Porque em C# eles cabem. Diferente do Number do JavaScript (que perde precisão acima de 2^53), o long de C# aguenta a faixa inteira de int64 nativamente, então não tem motivo para cair em string. Se você está desserializando JSON proto3 onde inteiros de 64 bits chegam como strings (pela spec de mapeamento JSON), System.Text.Json com JsonNumberHandling.AllowReadingFromString dá conta da conversão.

Como ele lida com a convenção de valores SCREAMING_SNAKE em enums?

O guia de estilo do Protobuf recomenda prefixar todo valor de enum com o nome do enum em SCREAMING_SNAKE. O conversor detecta isso e tira o prefixo. ORDER_STATUS_UNSPECIFIED no enum OrderStatus vira OrderStatus.Unspecified. Se o seu enum não segue a convenção (alguns valores prefixados, outros não), o strip do prefixo é pulado e os valores ficam em PascalCase como estão.

Ele lida com oneof?

Cada campo de oneof é emitido como auto-property normal. A saída não força a restrição de "exatamente um" que oneof implica — a linguagem C# ainda não tem discriminated unions nativos. Se você precisa de modelagem mais rigorosa, dê uma olhada em bibliotecas como OneOf no NuGet, ou edite a saída à mão para usar uma classe base com subclasses.

E google.protobuf.Timestamp e os well-known types?

Timestamp é emitido como string (o JSON proto3 codifica timestamps como strings RFC 3339). Empty e Any viram placeholders object — ajuste para Google.Protobuf.WellKnownTypes.Any ou um tipo mais forte se o seu projeto puxa o pacote WKT. A saída é propositalmente livre de framework, então você pode jogar em qualquer projeto C# sem forçar uma dependência NuGet.

Ferramentas relacionadas

Se você está fazendo malabarismo com Protobuf, JSON e C#, estas combinam bem: