が得られたデータをシリアライズとデシリアライズしながら、私のミスを理解することができません私は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つのビルダーを使用している トム
annlistが大きい場合には、20を言って、私はベクトルを作成する前に、すべてのアナウンスを構築することができますかわからないので、私はそれが動作するかどうかを確認するためにbuilder1を作成してみました。すべてのアナウンスを作成してベクトルを作成する方法を教えてください。 – tommy
ベクターのサイズは重要ではありません。任意の数のアナウンスをビルダーに構築し、同じサイズの一時的なベクトルでオフセットを収集します。次に、同じビルダー内のFlatBuffersベクトルを作成し、その後にルート・テーブル(ベクトルを参照)を作成します。 – Aardappel
あなたの提案したコードと私の質問のスキーマファイルを更新しました。間違いなくあなたの提案に基づいて変更した後、このコードでより大きなフラットバッファを取得していますが、まだバッファからデータを戻すことはできません。私の質問にお答えいただきありがとうございます。 – tommy