一種數(shù)據(jù)構(gòu)造方法和裝置制造方法
【專利摘要】本發(fā)明公開了一種數(shù)據(jù)構(gòu)造方法和裝置,屬于網(wǎng)絡(luò)通信領(lǐng)域。方法包括:對用戶上傳的Proto文件進(jìn)行編譯,得到與用戶預(yù)設(shè)的指定消息名稱對應(yīng)的指定消息結(jié)構(gòu);生成與指定消息結(jié)構(gòu)對應(yīng)的Web頁面,將指定消息的數(shù)據(jù)填充到Web頁面中生成Web頁面數(shù)據(jù);將Web頁面數(shù)據(jù)轉(zhuǎn)化為Json格式數(shù)據(jù);根據(jù)Json格式數(shù)據(jù),創(chuàng)建指定消息對象;對指定消息對象進(jìn)行序列化,得到指定消息的ProtoBuf數(shù)據(jù)文件。本發(fā)明解決了Protobuf數(shù)據(jù)的構(gòu)造代價比較大數(shù)據(jù)準(zhǔn)確性差、Protobuf數(shù)據(jù)的復(fù)用率低以及對使用人員技術(shù)要求高的問題,簡化數(shù)據(jù)構(gòu)造的過程,降低對使用者技術(shù)的要求,提高數(shù)據(jù)構(gòu)造的效率以及數(shù)據(jù)的復(fù)用性和準(zhǔn)確性。
【專利說明】一種數(shù)據(jù)構(gòu)造方法和裝置
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及網(wǎng)絡(luò)通信領(lǐng)域,特別涉及一種數(shù)據(jù)構(gòu)造方法和裝置。
【背景技術(shù)】
[0002]Protobuf (Protocol Buffers),是Google公司開發(fā)的一種數(shù)據(jù)描述語言,能夠?qū)⒔Y(jié)構(gòu)化數(shù)據(jù)序列化,可用于數(shù)據(jù)存儲、通信協(xié)議等方面,由于Protobuf出色的性能和很好的擴(kuò)展性而得到廣泛應(yīng)用。但是,Protobuf格式的數(shù)據(jù)構(gòu)造卻是復(fù)雜的過程。
[0003]目前,Protobuf數(shù)據(jù)構(gòu)造方式一般是首先獲取到Protobuf的定義文件proto文件,然后利用Google提供的Protoc編譯器對proto文件編譯并生成的特定語言的數(shù)據(jù)訪問類文件(.Java或.cc或.py),然后在程序中將數(shù)據(jù)訪問類文件包含進(jìn)去,利用數(shù)據(jù)訪問類文件中的代碼接口進(jìn)行Protobuf數(shù)據(jù)的構(gòu)造以及解析。
[0004]在實(shí)現(xiàn)本發(fā)明的過程中,發(fā)明人發(fā)現(xiàn)現(xiàn)有技術(shù)至少存在以下問題:
[0005]首先,隨著業(yè)務(wù)的不斷擴(kuò)展和完善,Protobuf的定義文件通常會被一次有一次的重寫,并且結(jié)構(gòu)的復(fù)雜性和嵌套層次也在不斷的增加,這就導(dǎo)致整個數(shù)據(jù)的構(gòu)造過程非常繁瑣和緩慢,Protobuf數(shù)據(jù)的構(gòu)造代價比較大,數(shù)據(jù)準(zhǔn)確性差;
[0006]然后,一次性構(gòu)造的數(shù)據(jù)在后續(xù)的過程中不能重復(fù)使用,或者每次對上次數(shù)據(jù)修改后都要重新編譯使用,過程重復(fù)且Protobuf數(shù)據(jù)的復(fù)用率低;
[0007]最后,由于目前Protobuf格式提供C++, Java和Python三種語言接口,使用人員除了需要了解Protobuf的特點(diǎn)和構(gòu)造方式,還需要至少熟悉C++, Java,Python中的一種編程語言,對Protobuf使用人員的技術(shù)要求較高。
【發(fā)明內(nèi)容】
[0008]為了解決現(xiàn)有技術(shù)的問題,本發(fā)明實(shí)施例提供了一種數(shù)據(jù)構(gòu)造方法和裝置。所述技術(shù)方案如下:
[0009]一方面,提供了一種數(shù)據(jù)構(gòu)造方法,所述方法包括:
[0010]對用戶上傳的PiOto文件進(jìn)行編譯,得到與用戶預(yù)設(shè)的指定消息名稱對應(yīng)的指定消息結(jié)構(gòu);所述Proto文件為ProtoBuf數(shù)據(jù)的定義文件;
[0011]生成與所述指定消息結(jié)構(gòu)對應(yīng)的Web頁面,將所述指定消息的數(shù)據(jù)填充到所述Web頁面中生成Web頁面數(shù)據(jù);
[0012]將所述Web頁面數(shù)據(jù)轉(zhuǎn)化為Json格式數(shù)據(jù);
[0013]根據(jù)所述Json格式數(shù)據(jù),創(chuàng)建指定消息對象;
[0014]對所述指定消息對象進(jìn)行序列化,得到所述指定消息的ProtoBuf數(shù)據(jù)文件。
[0015]具體地,所述得到所述指定消息的ProtoBuf數(shù)據(jù)文件之后,還包括:
[0016]對所述Proto文件進(jìn)行編譯得到ProtoBuf數(shù)據(jù)的消息結(jié)構(gòu),并根據(jù)所述指定消息名稱獲取對應(yīng)的指定消息結(jié)構(gòu);
[0017]對所述指定消息的ProtoBuf數(shù)據(jù)文件進(jìn)行反序列化,得到所述指定消息對象;[0018]根據(jù)所述指定消息對象,獲取對應(yīng)的所述Json格式數(shù)據(jù);
[0019]將所述Json格式數(shù)據(jù)填充到所述Web頁面,進(jìn)行轉(zhuǎn)化得到所述Web頁面數(shù)據(jù)。
[0020]進(jìn)一步地,所述將所述Json格式數(shù)據(jù)填充到所述Web頁面,進(jìn)行轉(zhuǎn)化得到所述Web頁面數(shù)據(jù)之后,包括:
[0021 ] 獲取用戶在所述Web頁面的操作,根據(jù)所述操作對所述Web頁面數(shù)據(jù)進(jìn)行編輯;所述編輯至少包括修改、刪除、增加、隱藏以及展示。
[0022]具體地,所述對用戶上傳的Proto文件進(jìn)行編譯之前,包括:
[0023]獲取用戶上傳的Proto文件以及用戶預(yù)定的所述指定消息名稱和所述指定消息的數(shù)據(jù)。
[0024]具體地,所述對用戶上傳的Proto文件進(jìn)行編譯,得到用戶預(yù)設(shè)的指定消息名稱對應(yīng)的指定消息結(jié)構(gòu),包括:
[0025]對用戶上傳的Proto文件進(jìn)行編譯,得到ProtoBuf數(shù)據(jù)的消息結(jié)構(gòu);
[0026]在所述ProtoBuf數(shù)據(jù)的消息結(jié)構(gòu)中查找與用戶預(yù)設(shè)的指定消息名稱對應(yīng)的指定消息結(jié)構(gòu)。
[0027]另一方面,提供了一種數(shù)據(jù)構(gòu)造裝置,所述裝置包括:
[0028]第一編譯模塊,用于對用戶上傳的Proto文件進(jìn)行編譯,得到與用戶預(yù)設(shè)的指定消息名稱對應(yīng)的指定消息結(jié)構(gòu);所述Proto文件為ProtoBuf數(shù)據(jù)的定義文件;
[0029]第一 Web生成模塊,用于生成與所述指定消息結(jié)構(gòu)對應(yīng)的Web頁面,將所述指定消息的數(shù)據(jù)填充到所述Web頁面中生成Web頁面數(shù)據(jù);
[0030]第一 Json轉(zhuǎn)化模塊,用于將所述Web頁面數(shù)據(jù)轉(zhuǎn)化為Json格式數(shù)據(jù);
[0031]第一對象生成模塊,用于根據(jù)所述Json格式數(shù)據(jù),創(chuàng)建指定消息對象;
[0032]ProtoBuf數(shù)據(jù)生成模塊,用于對所述指定消息對象進(jìn)行序列化,得到所述指定消息的ProtoBuf數(shù)據(jù)文件。
[0033]具體地,所述裝置還包括:
[0034]第二編譯模塊,用于所述ProtoBuf數(shù)據(jù)生成模塊得到所述指定消息的ProtoBuf數(shù)據(jù)文件之后,對所述Proto文件進(jìn)行編譯得到ProtoBuf數(shù)據(jù)的消息結(jié)構(gòu),并根據(jù)所述指定消息名稱獲取對應(yīng)的指定消息結(jié)構(gòu);
[0035]第二對象生成模塊,用于對所述指定消息的ProtoBuf數(shù)據(jù)文件進(jìn)行反序列化,得到所述指定消息對象;
[0036]第二 Json轉(zhuǎn)化模塊,用于根據(jù)所述指定消息對象,獲取對應(yīng)的所述Json格式數(shù)據(jù);
[0037]第二 Web生成模塊,用于將所述Json格式數(shù)據(jù)填充到所述Web頁面,進(jìn)行轉(zhuǎn)化得到所述Web頁面數(shù)據(jù)。
[0038]進(jìn)一步地,所述裝置還包括:
[0039]編輯模塊,用于所述第二 Web生成模塊進(jìn)行轉(zhuǎn)化得到所述Web頁面數(shù)據(jù)之后,獲取用戶在所述Web頁面的操作,根據(jù)所述操作對所述Web頁面數(shù)據(jù)進(jìn)行編輯;所述編輯至少包括修改、刪除、增加、隱藏以及展示。
[0040]具體地,所述裝置包括:
[0041]獲取模塊,用于所述第一編譯模塊Proto文件進(jìn)行編譯之前,獲取用戶上傳的Proto文件以及用戶預(yù)定的所述指定消息名稱和所述指定消息的數(shù)據(jù)。
[0042]具體地,所述第一編譯模塊,包括:
[0043]編譯單元,用于對用戶上傳的Proto文件進(jìn)行編譯,得到ProtoBuf數(shù)據(jù)的消息結(jié)構(gòu);
[0044]查找單元,用于在所述ProtoBuf數(shù)據(jù)的消息結(jié)構(gòu)中查找與用戶預(yù)設(shè)的指定消息名稱對應(yīng)的指定消息結(jié)構(gòu)。
[0045]本發(fā)明實(shí)施例提供的技術(shù)方案帶來的有益效果是:
[0046]通過對用戶上傳的PiOto文件進(jìn)行編譯,得到用戶預(yù)設(shè)的指定消息名稱對應(yīng)的指定消息結(jié)構(gòu);生成與指定消息結(jié)構(gòu)對應(yīng)的Web頁面并填充指定消息的數(shù)據(jù),將Web頁面數(shù)據(jù)轉(zhuǎn)化為Json格式數(shù)據(jù)后,創(chuàng)建指定消息對象;對指定消息對象進(jìn)行序列化,得到指定消息的ProtoBuf數(shù)據(jù)文件。解決了 Protobuf數(shù)據(jù)的構(gòu)造代價比較大數(shù)據(jù)準(zhǔn)確性差、Protobuf數(shù)據(jù)的復(fù)用率低以及對Protobuf使用人員技術(shù)要求高的問題,簡化數(shù)據(jù)構(gòu)造的過程,降低對使用者技術(shù)的要求,提高數(shù)據(jù)構(gòu)造的效率,提高了數(shù)據(jù)的復(fù)用性和準(zhǔn)確性。
【專利附圖】
【附圖說明】
[0047]為了更清楚地說明本發(fā)明實(shí)施例中的技術(shù)方案,下面將對實(shí)施例描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
[0048]圖1是本發(fā)明實(shí)施例一提供的數(shù)據(jù)構(gòu)造方法流程圖;
[0049]圖2是本發(fā)明實(shí)施例二提供的數(shù)據(jù)構(gòu)造方法流程圖;
[0050]圖3是本發(fā)明實(shí)施例二提供的編譯Proto定義文件示意圖;
[0051]圖4是本發(fā)明實(shí)施例二提供的生成規(guī)則對應(yīng)圖;
[0052]圖5是本發(fā)明實(shí)施例二提供的代碼模板示意圖;
[0053]圖6是本發(fā)明實(shí)施例二提供的生成頁面示意圖;
[0054]圖7是本發(fā)明實(shí)施例三提供的數(shù)據(jù)構(gòu)造裝置第一種結(jié)構(gòu)示意圖;
[0055]圖8是本發(fā)明實(shí)施例三提供的數(shù)據(jù)構(gòu)造裝置第二種結(jié)構(gòu)示意圖;
[0056]圖9是本發(fā)明實(shí)施例三提供的數(shù)據(jù)構(gòu)造裝置第三種結(jié)構(gòu)示意圖;
[0057]圖10是本發(fā)明實(shí)施例三提供的數(shù)據(jù)構(gòu)造裝置第四種結(jié)構(gòu)示意圖;
[0058]圖11是本發(fā)明實(shí)施例三提供的數(shù)據(jù)構(gòu)造裝置第五種結(jié)構(gòu)示意圖。
【具體實(shí)施方式】
[0059]為使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合附圖對本發(fā)明實(shí)施方式作進(jìn)一步地詳細(xì)描述。
[0060]實(shí)施例一
[0061]參見圖1,本發(fā)明實(shí)施例提供了一種數(shù)據(jù)構(gòu)造方法,該方法包括:
[0062]101、對用戶上傳的Proto文件進(jìn)行編譯,得到與用戶預(yù)設(shè)的指定消息名稱對應(yīng)的指定消息結(jié)構(gòu);Proto文件為ProtoBuf數(shù)據(jù)的定義文件;
[0063]102、生成與指定消息結(jié)構(gòu)對應(yīng)的Web頁面,將指定消息的數(shù)據(jù)填充到Web頁面中生成Web頁面數(shù)據(jù);
[0064]103、將Web頁面數(shù)據(jù)轉(zhuǎn)化為Json格式數(shù)據(jù);
[0065]104、根據(jù)Json格式數(shù)據(jù),創(chuàng)建指定消息對象;
[0066]105、對指定消息對象進(jìn)行序列化,得到指定消息的ProtoBuf數(shù)據(jù)文件。
[0067]具體地,得到指定消息的ProtoBuf數(shù)據(jù)文件之后,還包括:
[0068]對Proto文件進(jìn)行編譯得到ProtoBuf數(shù)據(jù)的消息結(jié)構(gòu),并根據(jù)指定消息名稱獲取對應(yīng)的指定消息結(jié)構(gòu);
[0069]對指定消息的ProtoBuf數(shù)據(jù)文件進(jìn)行反序列化,得到指定消息對象;
[0070]根據(jù)指定消息對象,獲取對應(yīng)的Json格式數(shù)據(jù);
[0071]將Json格式數(shù)據(jù)填充到Web頁面,進(jìn)行轉(zhuǎn)化得到Web頁面數(shù)據(jù)。
[0072]進(jìn)一步地,將Json格式數(shù)據(jù)填充到Web頁面,進(jìn)行轉(zhuǎn)化得到Web頁面數(shù)據(jù)之后,包括:
[0073]獲取用戶在Web頁面的操作,根據(jù)操作對生成Web頁面數(shù)據(jù)進(jìn)行編輯;編輯至少包括修改、刪除、增加、隱藏以及展示。
[0074]具體地,對用戶上傳的Proto文件進(jìn)行編譯之前,包括:
[0075]獲取用戶上傳的Proto文件以及用戶預(yù)設(shè)的指定消息名稱和指定消息的數(shù)據(jù)。
[0076]具體地,對用戶上傳的Proto文件進(jìn)行編譯,得到用戶預(yù)設(shè)的指定消息名稱對應(yīng)的指定消息結(jié)構(gòu),包括:
[0077]對用戶上傳的Proto文件進(jìn)行編譯,得到ProtoBuf數(shù)據(jù)的消息結(jié)構(gòu);
[0078]在ProtoBuf數(shù)據(jù)的消息結(jié)構(gòu)中查找與用戶預(yù)設(shè)的指定消息名稱對應(yīng)的指定消息結(jié)構(gòu)。
[0079]本發(fā)明實(shí)施例提供的方法,通過對用戶上傳的Proto文件進(jìn)行編譯,得到用戶預(yù)設(shè)的指定消息名稱對應(yīng)的指定消息結(jié)構(gòu);生成與指定消息結(jié)構(gòu)對應(yīng)的Web頁面并填充指定消息的數(shù)據(jù),將Web頁面數(shù)據(jù)轉(zhuǎn)化為Json格式數(shù)據(jù)后,創(chuàng)建指定消息對象;對指定消息對象進(jìn)行序列化,得到指定消息的ProtoBuf數(shù)據(jù)文件。解決了 Protobuf數(shù)據(jù)的構(gòu)造代價比較大數(shù)據(jù)準(zhǔn)確性差、Protobuf數(shù)據(jù)的復(fù)用率低以及對Protobuf使用人員技術(shù)要求高的問題,簡化數(shù)據(jù)構(gòu)造的過程,降低對使用者技術(shù)的要求,提高數(shù)據(jù)構(gòu)造的效率,提高了數(shù)據(jù)的復(fù)用性和準(zhǔn)確性。
[0080]實(shí)施例二
[0081]參見圖2,本發(fā)明實(shí)施例提供了一種數(shù)據(jù)構(gòu)造方法,該方法包括:
[0082]201、獲取用戶上傳的PiOto文件以及用戶預(yù)設(shè)的指定消息名稱和指定消息的數(shù)據(jù);
[0083]具體地,Proto文件為ProtoBuf數(shù)據(jù)的定義文件;用戶還需要預(yù)定指定消息名稱和指定消息的數(shù)據(jù)以便后續(xù)使用。
[0084]202、對用戶上傳的PiOto文件進(jìn)行編譯,得到與用戶預(yù)設(shè)的指定消息名稱對應(yīng)的指定消息結(jié)構(gòu);
[0085]具體地,對用戶上傳的Proto文件進(jìn)行編譯,得到ProtoBuf數(shù)據(jù)的消息結(jié)構(gòu);在ProtoBuf數(shù)據(jù)的消息結(jié)構(gòu)中查找用戶預(yù)設(shè)的指定消息名稱對應(yīng)的指定消息結(jié)構(gòu)。
[0086]其中,對Proto文件的編譯工作由Proto文件編譯模塊來實(shí)現(xiàn),Proto文件編譯模塊的輸入是一個或多個proto文件的,經(jīng)過一系列的編譯過程(詞法、語法、語義分析),最終得到編譯結(jié)果;首先編譯得到的結(jié)果是一個proto文件的文件描述符FileDescriptor,該FileDescriptor詳細(xì)的記錄和描述了文件(對象)中各個message、各個結(jié)構(gòu)字段的取值、各個結(jié)構(gòu)字段之間的關(guān)系及結(jié)構(gòu)內(nèi)部的一些組織形式;而對于數(shù)據(jù)構(gòu)造,最終需要得到的是針對某個消息message的描述符Descriptor,即指定消息結(jié)構(gòu)。
[0087]另外,編譯模塊比較重要的一個過程是處理proto文件之間的依賴關(guān)系,該依賴關(guān)系可能是同一 proto文件內(nèi)部各個message之間,也可能是不同proto文件之間message的依賴關(guān)系,在編譯當(dāng)前message結(jié)構(gòu)的過程中,需要提前查找并編譯message的依賴項(xiàng)。所有proto文件是按照目錄的層次結(jié)構(gòu)存儲在SourceDiskTree數(shù)據(jù)結(jié)構(gòu)(功能類似于Database)中,編譯的中間結(jié)果是存儲在編譯器對象Importer的pool結(jié)構(gòu)中。如果編譯過程順利完成,能夠在Importer中得到各個proto文件,各個message以及各個field的信肩、O
[0088]參見圖3,整個編譯流程的輸入是一個或是多個proto文件,首先產(chǎn)生FileDescriptor,最終得到針對單個消息message的消息描述符Descriptor,在整個編譯的過程中會產(chǎn)生一系列的中間結(jié)果。
[0089]203、生成與指定消息結(jié)構(gòu)對應(yīng)的Web頁面,將指定消息的數(shù)據(jù)填充到Web頁面中生成Web頁面數(shù)據(jù);
[0090]具體地,Web頁面生成主要包括兩部分,一是前臺頁面的生成,二是對應(yīng)的JavaScript部分的生成。由于頁面的行為由JavaScript進(jìn)行控制,所以代碼生成部分的主要工作集中在JavaScript代碼生成部分。對于頁面部分可以采用統(tǒng)一的html代碼,因?yàn)閔tml只是內(nèi)容的載體,變化的是JavaScript所控制部分。對于JavaScript部分,需要根據(jù)編譯模塊的結(jié)果消息描述符Descriptor而去控制html展示成為不同的數(shù)據(jù)構(gòu)造頁面。
[0091]編譯結(jié)果和前臺展示形式需要制定詳細(xì)的生成方案和對應(yīng)關(guān)系??紤]到JavaScript代碼的可維護(hù)性和擴(kuò)展性,本發(fā)明實(shí)施例采用了 ExtJS(ajax框架)作為JavaScript代碼生成的一個標(biāo)準(zhǔn)。采用ExtJS框架由于其功能強(qiáng)大,界面美觀,是一種輕量級實(shí)現(xiàn)框架,并且將html中的一些控件以對象的形式進(jìn)行了封裝。
[0092]1、生成規(guī)則決定了編譯模塊得到的Descriptor對象如何生成對應(yīng)的Web頁面,方便用戶的編輯。對于一個Web頁面,首先考慮的是整個頁面的布局結(jié)構(gòu),為了方便后續(xù)功能的擴(kuò)展,并結(jié)合ExtJS框架的基本布局結(jié)構(gòu),本發(fā)明實(shí)施例采用border方式的布局,即將整個頁面分為東、南、西、北、中五部分。所有的生成頁面采用統(tǒng)一的布局結(jié)構(gòu),目前只利用了布局結(jié)構(gòu)的西部和中部。西部(即頁面的左邊)主要用來做導(dǎo)航功能,為了方便和Web端接口進(jìn)行接入;中部是生成的主要部分,根據(jù)message描述符的不同而生成的不同的控件。針對message描述符的具體信息,不同字段會生成不同的頁面部分,兩者的對應(yīng)關(guān)系如圖4所示:
[0093]對于消息message定義部分,基本單位是一個普通字段,普通字段主要包括修飾符Modifier、基本數(shù)據(jù)類型和字段名稱三部分;修飾符目前只有三種"optional"、"required"和〃r印eated";基本數(shù)據(jù)類型與各種編程語言數(shù)據(jù)類型一致,主要包括"double〃,〃float〃,〃int64〃,〃uint64〃,〃int32〃,〃fixed64〃,〃fixed32〃,〃bool〃,〃string〃,〃byte
” ”.”” AVr
s,umt3z,enum 寺。[0094]參見圖4,對于修飾符為optional或required的普通字段,對應(yīng)到頁面的顯示部分是一個基本單位,包括一個label和input,label主要顯示字段名稱和具體的數(shù)據(jù)類型,而input控件主要用來提供用戶的輸入。此外對于修飾符為required的字段,label顯示為紅色字體,提醒用戶該字段不能為空。對于enum類型和bool類型字段部分,為了數(shù)據(jù)的準(zhǔn)確性,采用下拉菜單(combobox)的顯示樣式,用戶只需要選擇具體的enum值即可。有效的減少數(shù)據(jù)出錯的可能性。
[0095]對于修飾符為repeated的普通字段,顯示位置與optional和required普通字段部分不同,所有的optional和requreid的普通字段部分是顯示在一個FieldContainer里面,每一個repeated字段是一個新的FieldContainer。對于repeated的字段部分需要添加新增和刪除按鈕,方便用戶添加和刪除數(shù)據(jù)單位。每次添加都是在當(dāng)前FieldContainer里面新增加一個新的Form,然后在Form中添加一個普通的字段。但是普通字段部分沒有l(wèi)abel顯示部分。所有添加的r印eated普遍字段部分共用一個label顯示字段名稱和數(shù)據(jù)類型。
[0096]對于修飾符為optional或required的message字段,對應(yīng)到頁面顯示部分也是一個新的FieldContainer,跟optional或reuqired的普通類型字段不在一個FieldContainer里面。對于optional部分,默認(rèn)是不展開該message的具體內(nèi)容的,只有當(dāng)用戶點(diǎn)擊Edit按鈕時,才會創(chuàng)建該message對象,并顯示具體包含的字段;對于required部分,默認(rèn)對象已經(jīng)創(chuàng)建,并且不能刪除,只能進(jìn)行隱藏和顯示的操作。對于message里面包含的子字段的處理部分,跟各種字段處理情況相同。
[0097]對于修飾符為repeated的message字段部分,對應(yīng)到頁面的顯示部分跟repeated普通字段部分一致,但是每次添加和刪除的單位是一個message數(shù)據(jù)單位,頁面顯示為一個Form。Message內(nèi)部的各個字段顯示形式跟各種字段顯示方式一致。由外到內(nèi)是一個不斷嵌套的過程,直到包含所有嵌套字段。
[0098]2、考慮到代碼生成設(shè)計(jì)到多種語言混合編程,如何保證代碼的可維護(hù)性和可擴(kuò)展性顯得十分重要。對于后臺程序的開發(fā)采用C/C++語言,而要生成的Web代碼則包括html,JavaScript,甚至一些CSS樣式。如何解決跨語言編程和代碼的易讀性,是工具實(shí)現(xiàn)的一個難點(diǎn),最終實(shí)現(xiàn)采用了模板引擎技術(shù)ctemplate。模板引擎并是模型和視圖分離的重要手段。整個代碼生成部分的模板設(shè)計(jì)如圖5所示,各個代碼模板的主要功能介紹如下:
[0099]pb_extjs.tpl:該模板是整個代碼模板的開始部分,也是框架部分,模板包含3個子模板,frame, tpl、top_form.tpl和sharedJavaScript.tpl,該模板主要用來初始化一些全局變量。
[0100]pb_extjs_frame.tpl:該模板主要功能是控制生成ExtJS頁面的整體結(jié)構(gòu),包括構(gòu)造一些全局容器控件,指定容器的布局結(jié)構(gòu),以及一些顯示樣式。在我們的代碼生成過程中主要初始化總的布局結(jié)構(gòu)為border,并創(chuàng)建和初始化結(jié)構(gòu)的west部分和center部分。
[0101]pb_ext js_top_form.tpl:由于整個布局的center部分是分層進(jìn)行構(gòu)建和初始化的。該模板創(chuàng)建并初始化center部分的最外層控件,并添加最外層控件的事件處理函數(shù)和部分子控件。此處命名中的top和后面的nested的區(qū)別開來,主要是最外層控件的生成工作。
[0102]pb_ext js_sharedJavaScript.tpl:該模板用來添加一些公共的 JavaScript 函數(shù)和一些通用的事件處理函數(shù),例如獲取整個頁面用戶輸入的數(shù)據(jù)、提交數(shù)據(jù)請求到后臺、用戶輸入數(shù)據(jù)合法性驗(yàn)證、數(shù)據(jù)重置和加載后臺數(shù)據(jù)到頁面顯示等。
[0103]pb_extjs_nested_form_optional.tpl:該模板是針對 optional message field而設(shè)計(jì),主要負(fù)責(zé)在頁面中生成message對應(yīng)的FieldContainer控件,包括form的edit、show和hide事件處理,以及單個form內(nèi)部字段的生成和相應(yīng)事件處理等。
[0104]pb_extjs_nested_form_re_peated.tpl:該模板是針對 repeated field 而設(shè)計(jì),包括message類型和non-message類型,兩種類型在生成邏輯方面存在一致性。模板主要負(fù)責(zé)在頁面中生成message對應(yīng)的FieldContainer控件,包括form的add和delete事件處理,以及每個form內(nèi)部字段的生成和對應(yīng)的事件處理。
[0105]pb_extjs_nested_form_re_quired.tpl:該模板是針對required message field而設(shè)計(jì),主要負(fù)責(zé)在頁面中生成message對應(yīng)的FieldContainer控件,包括form的show和hide事件處理,以及單個form內(nèi)部字段的生成和對應(yīng)的事件處理等。
[0106]pb_ext js_common_field.tpl:該模板是針對 optional/required non-messagefield而設(shè)計(jì),是整個代碼模板的基本單位,前面提到的每個模板最終都由common_field.tpl構(gòu)成。該模板主要負(fù)責(zé)基本字段的添加和顯示,內(nèi)部包含一些針對optional和required字段的特殊處理。
[0107]204、將Web頁面數(shù)據(jù)轉(zhuǎn)化為Json格式數(shù)據(jù);
[0108]具體地,JSON數(shù) 據(jù)是用鍵值對的形式存儲的,采用完全獨(dú)立于語言的文本格式,是理想的數(shù)據(jù)交換語言。
[0109]205、根據(jù)Json格式數(shù)據(jù),創(chuàng)建指定消息對象;
[0110]具體地,數(shù)據(jù)構(gòu)造模塊從Web獲得JSON格式字符串,如:{〃AddressBook〃: {〃AddressBook_l〃:{〃person_l〃:{〃name〃:〃lericzhang〃,〃id〃:〃6210〃,〃email〃:〃leric@tencent.com", //phone_l//: {^number^: ^13613665015^, "type": "0"}}},//AddressBook_2//:{〃person_l〃:{〃name〃:〃lericzhang〃,〃id〃:〃6210〃,〃email〃:〃leric@tenc ent.com〃,〃phone_l": {"number": "13613665015","type": "0"}}}}}。所有字段都是以 key/value 形式出現(xiàn),key即為field的name, value則是用戶輸入的具體數(shù)值,如果key值對應(yīng)的field為message,貝丨J value值以〃 {} 〃包含。在JSON字符串中,所有的key和value值均是使用〃〃進(jìn)行包括起來,也就是采用字符串的形式,后續(xù)數(shù)據(jù)構(gòu)造的過程中根據(jù)字段的定義需要做數(shù)據(jù)類型的轉(zhuǎn)化。
[0111]206、對指定消息對象進(jìn)行序列化,得到指定消息的ProtoBuf數(shù)據(jù)文件。
[0112]具體地,采用預(yù)設(shè)的編碼方式對指定消息對象進(jìn)行序列化,得到指定消息的ProtoBuf數(shù)據(jù)文件。
[0113]步驟201-206,完成了數(shù)據(jù)的構(gòu)造過程,從用戶上傳一個或多個proto文件開始,到指定消息的ProtoBuf數(shù)據(jù)文件的整個過程,最終得到的ProtoBuf數(shù)據(jù)文件內(nèi)容是經(jīng)過編碼的數(shù)據(jù),對用戶來說是不可識別的。
[0114]參見圖6,下面對指定消息的ProtoBuf數(shù)據(jù)文件進(jìn)行解析,具體過程如下
[0115]207 JtProto文件進(jìn)行編譯得到ProtoBuf數(shù)據(jù)的消息結(jié)構(gòu),并根據(jù)指定消息名稱獲取對應(yīng)的指定消息結(jié)構(gòu);
[0116]具體步驟參見步驟202,不再贅述。[0117]208、對指定消息的ProtoBuf數(shù)據(jù)文件進(jìn)行反序列化,得到指定消息對象;
[0118]具體地,采取與步驟206序列化相反的處理,采用預(yù)設(shè)的編碼方式對指定消息的ProtoBuf數(shù)據(jù)文件進(jìn)行反序列化,得到指定消息對象。
[0119]209、根據(jù)指定消息對象,獲取對應(yīng)的Json格式數(shù)據(jù);
[0120]具體地,解析模塊的輸入是已存在的Protobuf數(shù)據(jù)文件,在進(jìn)行數(shù)據(jù)解析之前,首先需要知是數(shù)據(jù)文件的格式,主要分為是普通文件格式和Record I/O文件格式。兩種文件的讀取接口不同。其次是該數(shù)據(jù)文件對應(yīng)的proto文件和message名稱,只有知道這個信息才能夠編譯proto文件獲得message的具體描述符,進(jìn)而可以解析文件內(nèi)容獲得各個字段對應(yīng)的取值。數(shù)據(jù)解析模塊的主要處理分大體分為2個過程:首先從數(shù)據(jù)文件中讀取數(shù)據(jù)并序列化為message對象,其次遍歷message對象獲得對應(yīng)的JSON格式字符串。
[0121]210、將Json格式數(shù)據(jù)填充到Web頁面,進(jìn)行轉(zhuǎn)化得到Web頁面數(shù)據(jù)。
[0122]具體地,將Json格式數(shù)據(jù)填充到Web頁面,進(jìn)行轉(zhuǎn)化得到Web頁面數(shù)據(jù)之后,包括:
[0123]獲取用戶在Web頁面的操作,根據(jù)操作對生成Web頁面數(shù)據(jù)進(jìn)行編輯;編輯至少包括修改、刪除、增加、隱藏以及展示。
[0124]步驟207-210,完成了 ProtoBuf數(shù)據(jù)的解析過程。
[0125]本發(fā)明實(shí)施例提供的方法,通過對用戶上傳的Proto文件進(jìn)行編譯,得到用戶預(yù)設(shè)的指定消息名稱對應(yīng)的指定消息結(jié)構(gòu);生成與指定消息結(jié)構(gòu)對應(yīng)的Web頁面并填充指定消息的數(shù)據(jù),將Web頁面數(shù)據(jù)轉(zhuǎn)化為Json格式數(shù)據(jù)后,創(chuàng)建指定消息對象;對指定消息對象進(jìn)行序列化,得到指定消息的ProtoBuf數(shù)據(jù)文件。解決了 Protobuf數(shù)據(jù)的構(gòu)造代價比較大數(shù)據(jù)準(zhǔn)確性差、Protobuf數(shù)據(jù)的復(fù)用率低以及對Protobuf使用人員技術(shù)要求高的問題,簡化數(shù)據(jù)構(gòu)造的過程,降低對使用者技術(shù)的要求,提高數(shù)據(jù)構(gòu)造的效率,提高了數(shù)據(jù)的復(fù)用性和準(zhǔn)確性。
[0126]實(shí)施例三
[0127]參見圖7,本發(fā)明實(shí)施例提供了一種數(shù)據(jù)構(gòu)造裝置,該裝置包括:
[0128]第一編譯模塊701,用于對用戶上傳的PiOto文件進(jìn)行編譯,得到與用戶預(yù)設(shè)的指定消息名稱對應(yīng)的指定消息結(jié)構(gòu);Proto文件為ProtoBuf數(shù)據(jù)的定義文件;
[0129]第一 Web生成模塊702,用于生成與指定消息結(jié)構(gòu)對應(yīng)的Web頁面,將指定消息的數(shù)據(jù)填充到Web頁面中生成Web頁面數(shù)據(jù);
[0130]第一 Json轉(zhuǎn)化模塊703,用于將Web頁面數(shù)據(jù)轉(zhuǎn)化為Json格式數(shù)據(jù);
[0131]第一對象生成模塊704,用于根據(jù)Json格式數(shù)據(jù),創(chuàng)建指定消息對象;
[0132]ProtoBuf數(shù)據(jù)生成模塊705,用于對指定消息對象進(jìn)行序列化,得到指定消息的ProtoBuf數(shù)據(jù)文件。
[0133]具體地,參見圖8,該裝置還包括:
[0134]第二編譯模塊706,用于ProtoBuf數(shù)據(jù)生成模塊得到指定消息的ProtoBuf數(shù)據(jù)文件之后,對Proto文件進(jìn)行編譯得到ProtoBuf數(shù)據(jù)的消息結(jié)構(gòu),并根據(jù)指定消息名稱獲取對應(yīng)的指定消息結(jié)構(gòu);
[0135]第二對象生成模塊707,用于對指定消息的ProtoBuf數(shù)據(jù)文件進(jìn)行反序列化,得到指定消息對象;[0136]第二 Json轉(zhuǎn)化模塊708,用于根據(jù)指定消息對象,獲取對應(yīng)的Json格式數(shù)據(jù);
[0137]第二 Web生成模塊709,用于將Json格式數(shù)據(jù)填充到Web頁面,進(jìn)行轉(zhuǎn)化得到Web頁面數(shù)據(jù)。
[0138]進(jìn)一步地,參見圖9,該裝置還包括:
[0139]編輯模塊710,用于第二 Web生成模塊進(jìn)行轉(zhuǎn)化得到Web頁面數(shù)據(jù)之后,獲取用戶在Web頁面的操作,根據(jù)操作對生成Web頁面數(shù)據(jù)進(jìn)行編輯;編輯至少包括修改、刪除、增力口、隱藏以及展示。
[0140]具體地,參見圖10,該裝置包括:
[0141]獲取模塊711,用于第一編譯模塊Proto文件進(jìn)行編譯之前,獲取用戶上傳的Proto文件以及用戶預(yù)設(shè)的指定消息名稱和指定消息的數(shù)據(jù)。
[0142]具體地,參見圖11,第一編譯模塊701,包括:
[0143]編譯單元701a,用于對用戶上傳的Proto文件進(jìn)行編譯,得到ProtoBuf數(shù)據(jù)的消息結(jié)構(gòu);
[0144]查找單元701b,用于在ProtoBuf數(shù)據(jù)的消息結(jié)構(gòu)中查找與用戶預(yù)設(shè)的指定消息名稱對應(yīng)的指定消息結(jié)構(gòu)。
[0145]本發(fā)明實(shí)施例提供的裝置,通過對用戶上傳的Proto文件進(jìn)行編譯,得到用戶預(yù)設(shè)的指定消息名稱對應(yīng)的指定消息結(jié)構(gòu);生成與指定消息結(jié)構(gòu)對應(yīng)的Web頁面并填充指定消息的數(shù)據(jù),將Web頁面數(shù)據(jù)轉(zhuǎn)化為Json格式數(shù)據(jù)后,創(chuàng)建指定消息對象;對指定消息對象進(jìn)行序列化,得到指定消息的ProtoBuf數(shù)據(jù)文件。解決了 Protobuf數(shù)據(jù)的構(gòu)造代價比較大數(shù)據(jù)準(zhǔn)確性差、Protobuf數(shù)據(jù)的復(fù)用率低以及對Protobuf使用人員技術(shù)要求高的問題,簡化數(shù)據(jù)構(gòu)造的過程,降低對使用者技術(shù)的要求,提高數(shù)據(jù)構(gòu)造的效率,提高了數(shù)據(jù)的復(fù)用性和準(zhǔn)確性。
[0146]需要說明的是:上述實(shí)施例提供的數(shù)據(jù)構(gòu)造裝置在對Protobuf數(shù)據(jù)進(jìn)行構(gòu)造時,僅以上述各功能模塊的劃分進(jìn)行舉例說明,實(shí)際應(yīng)用中,可以根據(jù)需要而將上述功能分配由不同的功能模塊完成,即將裝置的內(nèi)部結(jié)構(gòu)劃分成不同的功能模塊,以完成以上描述的全部或者部分功能。另外,上述實(shí)施例提供的數(shù)據(jù)構(gòu)造裝置與數(shù)據(jù)構(gòu)造方法實(shí)施例屬于同一構(gòu)思,其具體實(shí)現(xiàn)過程詳見方法實(shí)施例,這里不再贅述。
[0147]上述本發(fā)明實(shí)施例序號僅僅為了描述,不代表實(shí)施例的優(yōu)劣。
[0148]本領(lǐng)域普通技術(shù)人員可以理解實(shí)現(xiàn)上述實(shí)施例的全部或部分步驟可以通過硬件來完成,也可以通過程序來指令相關(guān)的硬件完成,的程序可以存儲于一種計(jì)算機(jī)可讀存儲介質(zhì)中,上述提到的存儲介質(zhì)可以是只讀存儲器,磁盤或光盤等。
[0149]以上僅為本發(fā)明的較佳實(shí)施例,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
【權(quán)利要求】
1.一種數(shù)據(jù)構(gòu)造方法,其特征在于,所述方法包括: 對用戶上傳的Proto文件進(jìn)行編譯,得到與用戶預(yù)設(shè)的指定消息名稱對應(yīng)的指定消息結(jié)構(gòu);所述Proto文件為ProtoBuf數(shù)據(jù)的定義文件; 生成與所述指定消息結(jié)構(gòu)對應(yīng)的Web頁面,將所述指定消息的數(shù)據(jù)填充到所述Web頁面中生成Web頁面數(shù)據(jù); 將所述Web頁面數(shù)據(jù)轉(zhuǎn)化為Json格式數(shù)據(jù); 根據(jù)所述Json格式數(shù)據(jù),創(chuàng)建指定消息對象; 對所述指定消息對象進(jìn)行序列化,得到所述指定消息的ProtoBuf數(shù)據(jù)文件。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述得到所述指定消息的ProtoBuf數(shù)據(jù)文件之后,還包括: 對所述Proto文件進(jìn)行編譯得到ProtoBuf數(shù)據(jù)的消息結(jié)構(gòu),并根據(jù)所述指定消息名稱獲取對應(yīng)的指定消息結(jié)構(gòu); 對所述指定消息的ProtoBuf數(shù)據(jù)文件進(jìn)行反序列化,得到所述指定消息對象; 根據(jù)所述指定消息對象,獲取對應(yīng)的所述Json格式數(shù)據(jù); 將所述Json格式數(shù)據(jù)填充到所述Web頁面,進(jìn)行轉(zhuǎn)化得到所述Web頁面數(shù)據(jù)。
3.根據(jù)權(quán)利要求2所述的方法,其特征在于,所述將所述Json格式數(shù)據(jù)填充到所述Web頁面,進(jìn)行轉(zhuǎn)化得到所述Web頁面數(shù)據(jù)之后,包括: 獲取用戶在所述Web頁面的操作,根據(jù)所述操作對所述Web頁面數(shù)據(jù)進(jìn)行編輯;所述編輯至少包括修改、刪除、增加、隱藏以及展示。
4.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述對用戶上傳的Proto文件進(jìn)行編譯之前,包括: 獲取用戶上傳的Proto文件以及用戶預(yù)定的所述指定消息名稱和所述指定消息的數(shù)據(jù)。
5.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述對用戶上傳的Proto文件進(jìn)行編譯,得到與用戶預(yù)設(shè)的指定消息名稱對應(yīng)的指定消息結(jié)構(gòu),包括: 對用戶上傳的Proto文件進(jìn)行編譯,得到ProtoBuf數(shù)據(jù)的消息結(jié)構(gòu); 在所述ProtoBuf數(shù)據(jù)的消息結(jié)構(gòu)中查找用戶預(yù)設(shè)的指定消息名稱對應(yīng)的指定消息結(jié)構(gòu)。
6.一種數(shù)據(jù)構(gòu)造裝置,其特征在于,所述裝置包括: 第一編譯模塊,用于對用戶上傳的Proto文件進(jìn)行編譯,得到與用戶預(yù)設(shè)的指定消息名稱對應(yīng)的指定消息結(jié)構(gòu);所述Proto文件為ProtoBuf數(shù)據(jù)的定義文件; 第一 Web生成模塊,用于生成與所述指定消息結(jié)構(gòu)對應(yīng)的Web頁面,將所述指定消息的數(shù)據(jù)填充到所述Web頁面中生成Web頁面數(shù)據(jù); 第一 Json轉(zhuǎn)化模塊,用于將所述Web頁面數(shù)據(jù)轉(zhuǎn)化為Json格式數(shù)據(jù); 第一對象生成模塊,用于根據(jù)所述Json格式數(shù)據(jù),創(chuàng)建指定消息對象; ProtoBuf數(shù)據(jù)生成模塊,用于對所述指定消息對象進(jìn)行序列化,得到所述指定消息的ProtoBuf數(shù)據(jù)文件。
7.根據(jù)權(quán)利要求6所述的裝置,其特征在于,所述裝置還包括: 第二編譯模塊,用于所述ProtoBuf數(shù)據(jù)生成模塊得到所述指定消息的ProtoBuf數(shù)據(jù)文件之后,對所述Proto文件進(jìn)行編譯得到ProtoBuf數(shù)據(jù)的消息結(jié)構(gòu),并根據(jù)所述指定消息名稱獲取對應(yīng)的指定消息結(jié)構(gòu); 第二對象生成模塊,用于對所述指定消息的ProtoBuf數(shù)據(jù)文件進(jìn)行反序列化,得到所述指定消息對象; 第二 Json轉(zhuǎn)化模塊,用于根據(jù)所述指定消息對象,獲取對應(yīng)的所述Json格式數(shù)據(jù); 第二 Web生成模塊,用于將所述Json格式數(shù)據(jù)填充到所述Web頁面,進(jìn)行轉(zhuǎn)化得到所述Web頁面數(shù)據(jù)。
8.根據(jù)權(quán)利要求7所述的裝置,其特征在于,所述裝置還包括: 編輯模塊,用于所述第二 Web生成模塊進(jìn)行轉(zhuǎn)化得到所述Web頁面數(shù)據(jù)之后,獲取用戶在所述Web頁面的操作,根據(jù)所述操作對所述Web頁面數(shù)據(jù)進(jìn)行編輯;所述編輯至少包括修改、刪除、增加、隱藏以及展示。
9.根據(jù)權(quán)利要求6所述的裝置,其特征在于,所述裝置包括: 獲取模塊,用于所述第一編譯模塊Proto文件進(jìn)行編譯之前,獲取用戶上傳的Proto文件以及用戶預(yù)定的所述指定消息名稱和所述指定消息的數(shù)據(jù)。
10.根據(jù)權(quán)利要 求6所述的裝置,其特征在于,所述第一編譯模塊,包括: 編譯單元,用于對用戶上傳的Proto文件進(jìn)行編譯,得到ProtoBuf數(shù)據(jù)的消息結(jié)構(gòu); 查找單元,用于在所述ProtoBuf數(shù)據(jù)的消息結(jié)構(gòu)中查找與用戶預(yù)設(shè)的指定消息名稱對應(yīng)的指定消息結(jié)構(gòu)。
【文檔編號】G06F17/30GK103970737SQ201310027270
【公開日】2014年8月6日 申請日期:2013年1月24日 優(yōu)先權(quán)日:2013年1月24日
【發(fā)明者】孔令揮 申請人:騰訊科技(深圳)有限公司