2011-03-28 10 views
9

프로토 파일과 그 반대의 해석 사용자 지정 옵션에서 C 번호를 생성, 나는에 노력하고있어하십시오 .proto 파일을 생성 .proto 파일 내가 <a href="http://code.google.com/p/protobuf-net/" rel="nofollow">protobuf-net</a>을 사용하고

  • 에서 C# 클래스를 생성

    1. 각각 사용하여 아주 쉽게는 C# 클래스

    에서 :

    1. protogen.exe 도구를
    2. Serializer<T>.GetProto() 방법

    그러나 것은 내가 프로토 버퍼 custom options을 지원해야하고 비록 내가만큼 간단하지 않는 것이다.

    설명해 드리죠 : 메시지와 분야에 적용되는 사용자 지정 옵션이 포함 된 프로토 파일에서

    1. , 나는 .NET의 사용자 지정 특성에 의해 장식 된 C# 클래스를 생성합니다.
    2. 사용자 지정 특성으로 장식 된 C# 클래스에서 메시지 및 필드에 사용자 지정 옵션이 적용되는 proto 파일을 생성하려고합니다.

    는 기본적으로 주어진 :

    message person { 
        option (my_message_option) = true; 
    
        optional string firstname = 1 [(my_field_option) = 42]; 
        optional string lastname = 2 [(my_field_option) = 12]; 
        optional int age = 3; 
    } 
    

    내가 생성 할 :

    [ProtoContract, MyMessageOption(true)] 
    public class Person 
    { 
        [ProtoMember(1), MyFieldOption(42)] 
        public string Firstname; 
    
        [ProtoMember(2), MyFieldOption(12)] 
        public string Firstname; 
    
        [ProtoMember(3)] 
        public string Firstname; 
    } 
    

    ... 그리고 그 반대의 경우도 마찬가지입니다.

    주 :

    • 사용자 지정 옵션 정의 (my_message_optionmy_field_option는) 이미 protofile (예를 들어, my_custom_options.proto)에 존재 수 있으며, 사용자 정의 클래스는 어딘가에 존재할 수 속성 (MyMessageOptionAttributeMyFieldOptionAttribute).
    • protogen.exe와 사용자 지정 xslt를 사용하려고했지만 protogen이 사용자 지정 옵션을 지원하는 으로 보이지 않습니다.

    달성하기 위해 가장 좋은 방법은 무엇입니까? 이 솔루션은 protobuf-net에 의존 할 필요가 없습니다.

  • +0

    proto 파일에서 데코 레이팅 된 C# 파일 (protobuf-net 용)을 생성하려면 동일한 작업을 수행하고 싶습니다. 당신이 이걸 어떻게 달성했는지에 대한 exapme를 주시겠습니까? 감사! – pogorman

    답변

    2

    나는 발전기 등록을 허용하여 SourceGenerators을 확장 할 수 있도록하기 위해 protobuf-csharp에서 ProtoGen 프로젝트를 포크하여 끝내었다.

    이렇게하면 proto 설명자 개체 모델을 사용하여 직접 C# 생성기를 작성할 수있었습니다. 생성 된 RegisterAllExtensions 방법을 사용하여

    1. 구성 ExtensionRegistry (다음 ProtoGen.exeProtoc.exe 사용) 사용자 정의 옵션
    2. 에 해당하는 C#을 유형을 생성합니다

      한 가지 까다로운 점은 구문 분석을 실행하기 전에 사용자 지정 옵션 유형을 등록하는 것입니다 .

    3. 고유 한 C# 생성기를 사용하여 코드 생성을 시작하십시오. 각 발전기에서 상황에 맞는 Descriptor.Options 컬렉션에 액세스 할 수 있습니다.
    1

    지금이 작업을 수행하는 간단한 방법은 없습니다. 필요한 변경 사항은 주로 csharp.xslt 파일입니다. 이것에 관한 버그 reported가 있지만 아직 해결되지 않았습니다.

    +0

    이미 특정 xslt 파일을 만들려고했지만 proto 파일에 사용 된 사용자 지정 옵션에 액세스 할 수 없습니다. protobuf-net이 아닌 다른 솔루션을 생각할 수 있습니까? –

    +0

    @Romain 이것은 내가 볼 기회가있는 구성이 아니므로 다음과 같습니다. xml 템플릿 ('-t : xml' 또는 유사)을 통해이를 실행하면,이 데이터가 숨어있는 곳을 나타낼 수있는 것을 알 수 있습니다. * 설명자에 대한 업데이트가 필요 없다고 가정합니다. . –

    +1

    그래, 내가 시도한 ('-t : xml')하지만 모든 사용자 정의 옵션은 결과 xml 파일에'uninterpreted_option'으로 표시됩니다. –

    관련 문제