C # aus Proto-Dateien generieren und umgekehrt benutzerdefinierte Optionen interpretieren

9

Ich verwende protobuf-net , und ich versuche Folgendes:

  1. Generieren Sie eine C # -Klasse aus einer .proto-Datei
  2. Erstellen Sie eine .proto-Datei aus einer C # -Klasse

Das ist ziemlich einfach mit:

  1. protogen.exe tool
  2. Serializer<T>.GetProto() Methode

Aber die Sache ist, dass ich protaBuffer benutzerdefinierte Optionen unterstützen muss und es nicht tut Es scheint so einfach zu sein wie ich.

Lass es mich erklären:

  1. Aus einer Protokolldatei, die benutzerdefinierte Optionen für Nachrichten und Felder enthält, möchte ich eine C # -Klasse generieren, die mit benutzerdefinierten .NET-Attributen versehen ist.
  2. Von einer C # -Klasse, die mit benutzerdefinierten Attributen versehen ist, möchte ich eine Proto-Datei erzeugen, in der benutzerdefinierte Optionen auf Nachrichten und Felder angewendet werden.

Grundsätzlich gegeben:

%Vor%

Ich möchte generieren:

%Vor%

... und umgekehrt.

Anmerkungen:

  • Die benutzerdefinierten Optionsdefinitionen ( my_message_option und my_field_option ) kann bereits existieren in einem Protofile (sagen wir, my_custom_options.proto) und der benutzerdefinierte Attribute Klassen können auch irgendwo existieren ( MyMessageOptionAttribute und MyFieldOptionAttribute ).
  • Ich habe versucht, protogen.exe und a benutzerdefinierte xslt, aber Protogen scheint nicht Unterstützung für benutzerdefinierte Optionen.

Was ist der bevorzugte Weg, um das zu erreichen? Die Lösung muss sich nicht auf protobuf-net verlassen.

    
Romain Verdier 28.03.2011, 11:43
quelle

2 Antworten

2

Am Ende gab ich das ProtoGen-Projekt von protobuf-csharp ab, um einige interne Typen zu veröffentlichen ( Generatoren, in den meisten Fällen) und um die SourceGenerators erweiterbar zu machen, indem benutzerdefinierte Generatorregistrierungen zugelassen werden.

Auf diese Weise konnte ich das Proto-Deskriptor-Objektmodell verwenden, um meinen eigenen C # -Generator zu schreiben.

Ein kniffliger Punkt ist, Ihre benutzerdefinierten Optionen zu registrieren, bevor Sie das Parsing starten:

  1. Generieren Sie C # -Typen, die Ihren benutzerdefinierten Optionen entsprechen (mit Protoc.exe dann ProtoGen.exe )
  2. Konfigurieren Sie ExtensionRegistry mithilfe der generierten RegisterAllExtensions Methoden.
  3. Starten Sie die Codegenerierung mit Ihren eigenen C # -Generatoren. In jedem Generator können Sie auf die kontextabhängige Descriptor.Options -Auflistung zugreifen.
Romain Verdier 31.03.2011, 13:31
quelle
1

Im Moment gibt es dafür keine einfache Möglichkeit. Die erforderlichen Änderungen würden hauptsächlich in der Datei csharp.xslt vorgenommen. Es gibt einen Fehler , der darüber berichtet wurde, aber noch nicht behoben wurde.

    
Marc Gravell 28.03.2011 12:02
quelle