2017-03-08 25 views
0

が得られたデータをシリアライズとデシリアライズしながら、私のミスを理解することができません私はFlatbuffersとGoLangに新しいです。オブジェクトをフラットバッファに変換して同じオブジェクトを取得する関数を実装しようとしています。ここに私のコードです。 更新されたコードFlatbuffers GoLang-データを取得することはできません

func getannouncements(){ 
    annList := SR.GetFromDB().GetAllAnnouncementList() 
    fmt.Println(annList) 
    builder := flatbuffers.NewBuilder(1024) 
    var thisobjlist [12] flatbuffers.UOffsetT 
    for i,j := range annList{ 
     annTitle := builder.CreateString(j.AnnTitle) 
     annText := builder.CreateString(j.AnnText) 
     annDate := builder.CreateString(j.AnnDate) 
     fb.AnnouncementStart(builder) 
     fb.AnnouncementAddAnnId(builder,int32(j.AnnID)) 
     fb.AnnouncementAddAnnTitle(builder,annTitle) 
     fb.AnnouncementAddAnnText(builder, annText) 
     fb.AnnouncementAddAnnActive(builder,CR.BoolToByte(j.AnnActive)) 
     fb.AnnouncementAddAnnDate(builder,annDate) 
     thisobj:= fb.AnnouncementEnd(builder) 
     thisobjlist[i] = thisobj 
    } 
    fb.AnnouncementListStartAnnListVector(builder,len(annList)) 
    for _,j:=range thisobjlist{ 
     builder.PlaceUOffsetT(j) 
    } 
    finalObj := fb.AnnouncementListEnd(builder) 
    builder.Finish(finalObj) 
    buf:= builder.FinishedBytes() 
    fmt.Println(buf) 
    /*bufItem := new(bytes.Buffer) 
    binary.Write(bufItem, binary.LittleEndian, buf) 
    buf1 := bufItem.Bytes() 
    buffyRead := bytes.NewReader(buf1) 
    var buffy []byte 
    binary.Read(buffyRead, binary.LittleEndian, &buffy)*/ 
    Anncmt:= fb.GetRootAsAnnouncementList(buf,0) 
    anns := new(fb.Announcement) 
    if Anncmt.AnnList(anns,1){ 
     thisLists := anns.AnnTitle() 
     fmt.Println(thisLists) 
    } 
    fmt.Println(Anncmt) 
    } 

スキーマBUFオブジェクトはバイト配列である

namespace FlatBufs; 
table Announcement{ 
    AnnId:int; 
    AnnTitle:string; 
    AnnText:string; 
    AnnDate:string; 
    AnnActive:bool= false; 
} 

table AnnouncementList{ 
    AnnName:string; 
    AnnList:[Announcement]; 
} 
root_type AnnouncementList 

ファイル。しかし、私がAnnGot objを生成しているとき、私はまだbufとほとんど同じバイト配列を取得しています。だから、このトピックでインターネット上のさまざまな記事を読むと、そのbufをバイナリタイプに変換してからbufを取り出して、(コードのコメント部分のように)データを取得しようとしました。今回は、オブジェクトbuffyにはデータがありません。このコード全体で私が間違っていることはまだ分かりません。

正しい方向に指摘してください。これに関する助けは大いに感謝しています。

おかげで、なぜあなたは2つのビルダーを使用している トム

答えて

0

わかりません。各Builderは1つのFlatBufferを作成しているので、1つに格納するものはもう1つのFlatBufferで使用できなくなります。

小さな問題は、あなたが入れ子になっているということです(Go実装はそれを防ぐ必要があります)、つまり、それらのベクトルを作成する前にすべてのアナウンスを完成させる必要があります。混乱した。

また、ルートをAnnouncementListにするように見えますが、Announcementとしてアクセスしようとします。これは機能しません。スキーマが見えるかどうかは簡単に分かります。

+0

annlistが大きい場合には、20を言って、私はベクトルを作成する前に、すべてのアナウンスを構築することができますかわからないので、私はそれが動作するかどうかを確認するためにbuilder1を作成してみました。すべてのアナウンスを作成してベクトルを作成する方法を教えてください。 – tommy

+0

ベクターのサイズは重要ではありません。任意の数のアナウンスをビルダーに構築し、同じサイズの一時的なベクトルでオフセットを収集します。次に、同じビルダー内のFlatBuffersベクトルを作成し、その後にルート・テーブル(ベクトルを参照)を作成します。 – Aardappel

+0

あなたの提案したコードと私の質問のスキーマファイルを更新しました。間違いなくあなたの提案に基づいて変更した後、このコードでより大きなフラットバッファを取得していますが、まだバッファからデータを戻すことはできません。私の質問にお答えいただきありがとうございます。 – tommy

関連する問題