0

我是 Flatbuffers 和 GoLang 的新手。我正在尝试实现一个将对象转换为 flatbuffer 并检索相同对象的函数。这是我的代码。 更新代码

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)
  }

架构文件

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

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

buf 对象是一个字节数组。但是,当我生成 AnnGot obj 时,我仍然得到与 buf 几乎相同的字节数组。因此,当我在互联网上阅读有关此主题的各种帖子时,我尝试将该 buf 转换为二进制类型,然后检索 buf 并尝试检索数据(如代码的注释部分所示)。这次对象 buffy 中没有任何数据。我仍然不清楚我在整个代码中犯了什么错误。

请指出我正确的方向。非常感谢您对此的任何帮助。

谢谢,汤姆

4

1 回答 1

0

不确定为什么要使用两个构建器。每个构建器都在创建一个 FlatBuffer,因此您存储在其中的东西在另一个中将不可用。

一个较小的问题是您正在嵌套事物(Go 实现应该防止这种情况发生,我相信?),即您应该在创建它们的向量之前完成所有公告的构建。在您的情况下,这一切都会混淆。

您似乎也将您的根设置为AnnouncementList,但随后您尝试将其作为Announcement.. 访问,这是行不通的。更容易查看我们是否可以看到您的架构。

于 2017-03-08T21:50:00.727 回答