2017-03-23 6 views
0

プロトコルバッファのシリアル化&の逆シリアル化を試しています(C language)。 下記のようにlearn.protoメッセージを作成し、メッセージを* uint8_tにパックして解凍しようとしました。プロトコルメッセージの不適切な逆シリアル化

syntax = "proto3"; 
package learn; 

message learnmessage { 

    enum LearnType { 
     ZERO = 0; 
     ONE = 1; 
     TWO = 2; 
     THREE = 3; 
     FOUR = 4; 
     FIVE = 5; 
     SIX = 6; 
    } 
    LearnType typ = 1; 
    string text = 2; 
} 

アンパック後、元のメッセージに何をパックしても、常にenum値が取得されます。ただし、デシリアライズ後もテキストフィールドの値は適切なままです。例えば 、私は列挙型LEARN__LEARNMESSAGE__LEARN_TYPE__THREE を梱包していますが、開梱後に、それは私が

は、誰かが私は私がやっている間違いを見つけ出す助けることはできgcc -o program mycode.c learn.pb-c.c -lprotobuf-cでそれをコンパイルLEARN__LEARNMESSAGE__LEARN_TYPE__ZERO

に変更されます:

#include <stdio.h> 
#include <stdlib.h> 
#include "learn.pb-c.h" 


int main() 
{ 
    Learn__Learnmessage msg = LEARN__LEARNMESSAGE__INIT, *msgCopy; 
    size_t len; 
    uint8_t *msgStr; 

    msg.typ = LEARN__LEARNMESSAGE__LEARN_TYPE__THREE; //corresponds to enum value 3 
    msg.text = "again"; 

    len = learn__learnmessage__get_packed_size(&msg); //get the length of the uint8_t needed to pack the message 
    msgStr = malloc(len * sizeof(uint8_t)); 

    learn__learnmessage__pack(&msg, msgStr); //packs the message into msgStr 

    msgCopy = learn__learnmessage__unpack(NULL, len, msgStr); //unpack the message into msgCopy 

    printf("Orginal: %d \n", msg.typ); //prints 3 (expected) 
    printf("Copy: %d \n", msgCopy->typ); //prints 0 (un-expected) 


} 
+0

'パッケージは何を学ぶん;'このCプログラムのためですか?その適用性は不明である。 – chux

+0

@chux私はプロトコルバッファーを学んでいます。だから私はその名前を選んだ。申し訳ありませんが、文脈に沿っていません。 – user3219492

答えて

1

生成されたCコードにフィールドprotobuf_c_boolean has_typ;があります。それを1に設定すると、事態が予想通りに始まりました。

ように、コードは実際にする必要があります

msg.typ = LEARN__LEARNMESSAGE__LEARN_TYPE__THREE; 
msg.has_typ = 1; 
msg.text = "again"; 
関連する問題