2016-05-27 8 views
0

flatbufferベリファイアを使用したbytearrayのflatbuffer構造体で、その2つのオブジェクトのスキーマ内の表が類似のデータ型から始まる場合、検証する方法はありますか?フラットバッファ検証者の振る舞い

例スキーマ:

table AddTaskResponse{ 
    blablabla:int; 
    foobar:int; 
} 

table AddTaskRequest{ 
    requestId:int; 
    taskId:int; 
    profileId:string; 
} 

私の現在の実験は私を示しています

flatbuffers::Verifier verifier(reinterpret_cast<unsigned char*>(data.data()),data.size()); 
bool isaddTaskResponse = VerifyAddTaskResponseBuffer(verifier); 
bool isaddTaskRequest = VerifyAddTaskRequestBuffer(verifier); 

両方boolsフラグisaddTaskResponseとisaddTaskRequestが真であり、その真の状態iがAddTaskResponseまたはAddTaskRequestを送る実際の構造から依存しません。

答えて

2

ベリファイアは、データが構造的に健全であることを確認するだけです(オフセットは範囲外になりません)が、バッファの型に関するデータはないので、型が互換性があれば動作します。

この場合、レスポンスベリファイアがリクエストバッファを見ると、レスポンスベリファイアは将来のバージョンのスキーマからのバッファであると考えられます(無視される余分なフィールドがあります)。同様に、リクエストベリファイアがレスポンスバッファを見ると、フィールドがないため、古いバージョンのスキーマがあると考えられます。

これは機能しますが、スキーマの進化を複雑にし、実装についていくつかの仮定をしているので、これはお勧めできません。外部コンテキストを介して、または内部的に(例えば、共用体型を使用して)、バッファの正確な型を常に知るべきです。