編輯:關於Android編程
前言:
之前使用NPOI插件編寫的導表工具,其實就是直接將數據進行序列化,解析時還需要進行反序列化,步驟比較繁復,最近看到Google的一個開源的項目protobuf,不僅可以用於進行excel表格數據的導出,還能直接用於網絡通信協議的定制。
一、protobuf簡介:
protobuf是由google公司發布的一個開源的項目,是一款方便而又通用的數據傳輸協議。所以我們在Unity中也可以借助protobuf來進行數據存儲和網絡協議兩方面的開發,這裡先說說數據存儲部分的操作,也就是:
將.xls表格數據通過protobuf進行序列化,並在Unity中使用。
1.下載資源:
Python2.7 安裝方法:python安裝和配置 protobuf-2.5.0.zip 下載地址:http://pan.baidu.com/s/1kVk5LhP protobuf-net github下載地址:https://github.com/mgravell/protobuf-net2.流程圖:
從上圖可看出基本的操作步驟:
.xls表格文件,先通過xls_deploy_tool.py生成對應的.data文件和.proto文件,其中.data文件就是表格數據序列化後的結果,而.proto文件則是用於生成反序列化時使用的解析類的中間狀態; 解析類.proto經過protoc.exe轉換成.desc文件,用於後面通過protobuf-net等工具轉化為特定的語言,這裡我們需要得到的是C#解析類,即.cs類; 在Unity中導入protobuf-net.dll庫,在C#代碼中調用上述生成的.cs解析類來解析.data中的數據。
二、導表環境配置:
1.Python相關配置:
由於從.xls文件生成.data和.proto,Python需要依賴Proto庫和xlrd庫,安裝配置步驟:
setuptools:這是Python的組件安裝管理器,需要在安裝protobuff組件前進行安裝,到setuptools官網下載插件的安裝包,解壓到指定目錄,然後使用命令行進入安裝包目錄,執行指令:python setup.py install; Protobuff:首先,我們將之前下載好的源碼包protobuf-2.5.0.zip和編譯包protoc-2.5.0-win32.zip壓縮包解壓到指定目錄,路徑最好不要包含中文;這裡我解壓protobuf-2.5.0.zip到的位置是“E:\Unity_Workplace\protobuf_250”;然後復制protoc-2.5.0-win32.zip解壓得到的protoc.exe到protobuf_250\src目錄下;在protobuf-2.5.0\python\google\protobuf下創建一個文件夾命名為compiler(安裝完成後會在此目錄下生成兩個文件__init__.py和plugin_pb2.py);使用命令行進入到解壓後的目錄下面的Python目錄,執行:python setup.py install; xlrd(xls reader):這其實是讀取xls表格數據的一個工具插件,到xlrd官網下載xrld的安裝包,解壓安裝包然後使用命令行進入安裝包目錄,執行指令:python setup.py install。
2.導表外部工具:
xls_deploy_tool.py:這個工具其實是github上的一個開源的符合protobuff標准的根據excel自動生成匹配的PB的定義(.proto文件)並將數據序列化後生成二進制數據或者文本數據(.data文件)的一個工具,github下載地址:xls_deploy_tool.py。 protoc.exe和protogen.exe:通過上面的工具,我們得到了兩個文件:存儲數據的.data文件和用於解析數據的.proto文件,但是我們在真正使用解析類來進行數據文件的解析時,必須是高級語言,當然protobuf-net提供很多種高級語言的支持。就像我們在Unity中我們使用的是C#語言,這需要兩個工具來實現,一個是protobuf-2.5.0中的protoc.exe將.proto文件轉換為“FileDescriptorSet”中間格式;另一個是使用protobuf-net中的protogen.exe,將中間格式的文件轉換為最終狀態,即高級語言的解析類.cs文件。可以到github上下載protobuf-net的源碼:protobuf-net,下載後解壓到本地,然後進入到解壓後protobuf-net-master\protobuf-net目錄下,通過Visual Studio打開protobuf-net.csproj: 編譯完成後在當前目錄下面的bin\Release目錄下,生成了編譯後的文件,其中我們需要的是protobuf-net.dll: 將protobuf-net.dll復制到protobuf-net-master\ProtoGen目錄下,用Visual Studio打開ProtoGen.csproj,參照上面步驟編譯ProtoGen項目,得到protobuf-net-master\ProtoGen\bin\Release目錄下面的protogen.exe及一些額外的文件,但在真正使用時此目錄下面的所有文件都是必須的:
三、樣例:
1.建立表格.xls:
當然使用此工具進行導表的表格需要符合指定的格式,根據xls_deploy_tool.py的備注內容:
# 說明: # excel 的前四行用於結構定義, 其余則為數據,按第一行區分, 分別解釋: # required 必有屬性 # optional 可選屬性 # 第二行: 屬性類型 # 第三行:屬性名 # 第四行:注釋 # 數據行:屬性值 # repeated 表明下一個屬性是repeated,即數組 # 第二行: repeat的最大次數, excel中會重復列出該屬性 # 2011-11-29 做了修改 第二行如果是類型定義的話,則表明該列是repeated # 但是目前只支持整形 # 第三行:無用 # 第四行:注釋 # 數據行:實際的重復次數 # required_struct 必選結構屬性 # optional_struct 可選結構屬性 # 第二行:結構元素個數 # 第三行:結構名 # 第四行:在上層結構中的屬性名 # 數據行:不用填 # 1 | required/optional | repeated | required_struct/optional_struct | # | ------------------| ---------:| ---------------------------------:| # 2 | 屬性類型 | | 結構元素個數 | # 3 | 屬性名 | | 結構類型名 | # 4 | 注釋說明 | | 在上層結構中的屬性名 | # 5 | 屬性值 | | |
當然可以參考github上下載到的樣例表格,下載tnt項目,然後復制其中python目錄下面的內容,其中xls文件中就有一個goods_info.xls的樣例表格:
2.xls_deploy_tool.py轉換得到.data和.proto:
進行導表的操作只需用在命令行中的一句指令即可完成:
python xls_deploy_tool.py sheet_name xls_path
其中包含兩個參數:sheet_name是.xls中要進行導表的表格頁名,xls_path是要進行導表的.xls文件的路徑。創建一個測試工程Test_protobuf,將1中的兩個文件和protoc.exe放入其中:
在命令行定位到該目錄下,然後運行指令:
call python xls_deploy_tool.py GOODS_INFO xls/goods_info.xls運行結束後,該目錄下多出了幾個文件,但我們真正需要的只有兩個文件,即.data數據文件和.proto解析類:
3.得到最終解析類:
protoc.exe得到中間格式文件,假設後綴為.protodesc,使用指令:
protoc 輸入文件路徑(.proto文件) --descriptor_set_out=輸出文件路徑(.protodesc)
在步驟2中的測試工程基礎上繼續執行指令:
protoc tnt_deploy_goods_info.proto --descriptor_set_out=goods_info.protodesc運行此步之後,在項目中又多出了一個與.proto對應的.protodesc文件:
protogen.exe得到.cs解析類,使用指令:
protogen -i:輸入文件路徑(.protodesc) -o:輸出文件路徑(.cs)
將之前生成protogen.exe時protobuf-net-master\ProtoGen\bin\Release目錄下面的所有文件復制到當前工程中,用一個文件夾ProtoGen來存放,假如不想執行這麼繁瑣的過程,也可以直接使用我編譯好的ProtoGen文件目錄壓縮包:ProtoGen.zip,在當前項目的根目錄下執行以下指令:
call ProtoGen\protogen -i:goods_info.protodesc -o:goods_info.cs執行結果,在當前目錄下生成了解析類的最終狀態goods_info.cs:
當然,以上三步可以直接用批處理來完成,直接在當前項目根目錄下新建一個文件,命名為generator.bat,內容為:
call python xls_deploy_tool.py GOODS_INFO xls/goods_info.xls call protoc tnt_deploy_goods_info.proto --descriptor_set_out=goods_info.protodesc call ProtoGen\protogen -i:goods_info.protodesc -o:goods_info.cs pause直接雙擊此文件即可完成以上所有操作生成最終的.data和.cs文件。
4.Unity導入庫文件:
將幾個文件添加到Unity工程中,將.data文件放在Assets\StreamingAssets\DataConfig目錄下,將protobuf-net.dll和goods_info.cs放在Assets目錄下:
創建一個Test.cs測試腳本,在腳本中using Protobuf用於導入protobuf-net.dll中的庫,然後使用using tnt_deploy導入導表生成的.cs表格數據解析類,腳本具體代碼內容為:
using UnityEngine; using System.Collections; using ProtoBuf; using System.IO; using tnt_deploy; public class Test : MonoBehaviour { void Start () { GOODS_INFO_ARRAY goods_infos = ReadOneDataConfig在Unity中新建一個場景,將Test.cs掛載在Main Camera主相機上,運行場景,看到打印結果,說明解析表格數據成功:("goods_info"); Debug.Log("goods_id==================" + goods_infos.items[0].goods_id); } private T ReadOneDataConfig (string FileName) { FileStream fileStream; fileStream = GetDataFileStream(FileName); if (null != fileStream) { T t = Serializer.Deserialize (fileStream); fileStream.Close(); return t; } return default(T); } private FileStream GetDataFileStream(string fileName) { string filePath = GetDataConfigPath(fileName); if (File.Exists(filePath)) { FileStream fileStream = new FileStream(filePath, FileMode.Open); return fileStream; } return null; } private string GetDataConfigPath(string fileName) { return Application.streamingAssetsPath + "/DataConfig/" + fileName + ".data"; } }
5.平台兼容問題:
由於直接把protobuf-net.dll放到項目中時,在iOS中會出現JIT錯誤(ExecutionEngineException: Attempting to JIT compile method)。原因是因為iOS不允許JIT(Just In Time),只允許AOT(Ahead Of Time)。
解決方法:
直接把protprotobuf-net-master\protobuf-net目錄下面的全部源碼復制到Unity項目的目錄下面,但是由於protobuf-net的編譯過程是unsafe編譯,所以Unity會出現編譯報錯:
需要在Assets目錄下添加一個smsc.rsp文件,其內容很簡單,只有一行“-unsafe”,添加完成後關閉Unity然後重新打開Unity,一切就正常了。
四、總結:
雖然導表環境的配置過程比較繁瑣,但是配置完成之後的工作效率卻很高,而且proto具有突出的通用性,可以應用於各種語言環境。
在網上看了比較多的關於Tab的教程,發現都很雜亂。比較多的用法是用TitlePagerTabStrip和ViewPaper。不過TitlePagerTabStrip有個很
今天我們來接觸一下多線程下載,當然也包括斷點續傳,我們可以看到很多下載器,當開通會員的時候下載東西的速度就變得快了許多,這是為什麼呢?這就是跟今天講的多線程有關系了,其實
有個愛折騰的美工是個什麼體驗。。。那就是效果,也是,android也就是個UI,UI注重的是用戶體驗,良好的用戶體驗跟舒適的UI效果是分不開的。這次要做的效果就是,做完測
1.控件焦點問題一些通知在開發過程中,會發現EditText這個控件如果處理不當會出現自動獲取焦點的情況,也就是當你打開你的應用是,界面會自動跳出軟件盤,那麼經過本人多次