NewLife.XCode是一個有10多年曆史的開源數據中間件,支持nfx/netcore,由新生命團隊(2002~2019)開發完成並維護至今,以下簡稱XCode。
整個系列教程會大量結合示例代碼和運行日誌來進行深入分析,蘊含多年開發經驗於其中,代表作有百億級大數據實時計算項目。
開源地址:https://github.com/NewLifeX/X (求star, 864+)
XCode是充血模型,在實體類上附帶有大量便捷操作,其中就包括各種目標數據類型的導入導出!
Json序列化
當下最常用的數據通信格式毋容置疑肯定是Json,實體對象可直接轉Json作爲接口返回值。
下面看看一個普通Role實體對象的Json序列化(ToJson)和Json反序列化(ToJsonEntity)的例程和效果。
如上,Role實體對象可通過ToJson轉爲json字符串,並通過ToJsonEntity把字符串轉爲另一個Role實體對象。
在XCode v9.0之前,實體基類Entity直接帶有ToJson/FromJson。後來因爲Json實在太常用了,提升爲全局擴展方法。
Json作爲最通用的數據傳輸格式(沒有之一),ToJson直接擴展Object,有三個參數:是否換行縮進、是否寫空值、是否駝峯命名
上文示例中的ToJson(true, false, false)表示採用換行縮進(可讀性更好),不寫空值(整數的0和字符串的null等),不適用駝峯命名。
Xml序列化
Xml作爲曾經的數據傳輸格式之王,仍然有相當一部分古老接口使用。
ToXml/ToXmlEntity 也是全局擴展方法,其中參數可以控制序列化爲普通Xml或者Xml屬性。
從結果來看,Xml可讀性非常好,但是佔用空間很大,一般比Json還要大一截。
二進制序列化
XCode序列化的絕招是二進制序列化,能夠讓實體對象和二進制數據互相轉換,更小、更快!
序列化同樣的實體對象,只需要39字節,遠小於Json和Xml,並且速度更快(不需要字符串分割操作)。
實體對象沒有ToBinary之類的快速方法,而是需要先轉化爲IAccessor接口,然後Write序列化爲數據流,或者Read讀取數據流。
數據流是個好東西,最常用的有內存流、文件流、網絡流、加密流、壓縮流,等等等。
文件流FileStream,可以讓實體對象保存爲文件,或者文件加載爲實體對象,(藉助文件緩存實體數據?);
網絡流NetworkStream,可以讓實體對象在網絡中傳輸;
IAccessor 訪問器接口,可實現任意對象到數據流的讀寫訪問。
NewLife.Redis 優先支持 IAccessor 接口,因此,把XCode實體對象寫入Redis時,採用的是二進制高效精簡格式,而不是默認的Json格式。
實體類可通過重載 OnWrite 來自定義二進制序列化的行爲。
/// <summary>二進制序列化到數據流</summary> /// <param name="stream">數據流</param> /// <param name="context">上下文</param> /// <param name="extend">是否序列化擴展屬性</param> protected virtual Boolean OnWrite(Stream stream, Object context, Boolean extend) { var bn = context as Binary; if (bn == null) bn = new Binary { Stream = stream, EncodeInt = true }; var fs = extend ? Meta.AllFields : Meta.Fields; foreach (var fi in fs) { bn.Write(this[fi.Name], fi.Type); } return true; }
從上面代碼可以看出,只是調用二進制序列化Binary來把各個數據字段寫入流中。
看到這裏,你是不是有很多可以大幹一場的想法?別急,這只是開胃菜,還有更好的。
示例中看到,二進制序列化最大缺點是可讀性極差!一般只能看到其中部分字符串。
實體列表存儲
單個實體對象的二進制序列化只適用於簡單場合,如寫入Redis,實際工程級應用,多以實體列表爲主。
實體列表存儲以擴展方法提供:
- Write,寫入實體列表到數據流
- Read,從數據流加載實體列表
- SaveFile,保存實體列表到文件(可用作數據緩存)
- LoadFile,從文件加載實體列表
以上示例演示了具有4個對象的角色列表如果讀寫數據流以及文件。
有朋友要問,能否藉助實體列表讀寫文件的功能,實現某些數據表的本地化緩存,即使數據庫宕機,仍然能夠繼續提供服務?
答案顯然是可以的,並且我在實際工作中也經常這麼幹。
數據分析中經常需要用到幾十上百臺服務器進行分析計算,應用啓動時必須把配置數據和常用基礎數據一次性載入內存,例如幾萬行的網點數據;
如果幾十個節點同時啓動向數據庫請求網點數據,數據庫將不堪重負變得非常緩慢,影響計算應用的加載甚至可能導致出錯退出;
這種場景,可以在加載一次後,把實體列表數據保存到本地文件中,然後定時(10分鐘)更新;
下次啓動時,直接使用本地緩存數據,大大提升了應用啓動速度,並且降低了數據庫負擔;
Csv導入導出
Csv格式常用於辦公室Excel數據傳遞,以及數據庫數據導入導出等。
XCode支持百萬級導出!內部 CsvFile 支持流式讀寫,一邊構造一邊寫入文件,而不是一次性在內存生成好再寫入!
魔方的 Excel導出、Csv導出、Json導出、Xml導出等功能,都由 XCode 實現!
系列教程
NewLife.XCode教程系列[2019版]
- 增刪改查入門。快速展現用法,代碼配置連接字符串
- 數據模型文件。建立表格字段和索引,名字以及數據類型規範,推薦字段(時間,用戶,IP)
- 實體類詳解。數據類業務類,泛型基類,接口
- 功能設置。連接字符串,調試開關,SQL日誌,慢日誌,參數化,執行超時。代碼與配置文件設置,連接字符串局部設置
- 反向工程。自動建立數據庫數據表
- 數據初始化。InitData寫入初始化數據
- 高級增刪改。重載攔截,自增字段,Valid驗證,實體模型(時間,用戶,IP)
- 髒數據。如何產生,怎麼利用
- 增量累加。高併發統計
- 事務處理。單表和多表,不同連接,多種寫法
- 擴展屬性。多表關聯,Map映射
- 高級查詢。複雜條件,分頁,自定義擴展FieldItem,查總記錄數,查彙總統計
- 數據層緩存。Sql緩存,更新機制
- 實體緩存。全表整理緩存,更新機制
- 對象緩存。字典緩存,適用用戶等數據較多場景。
- 百億級性能。字段精煉,索引完備,合理查詢,充分利用緩存
- 實體工廠。元數據,通用處理程序
- 角色權限。Membership
- 導入導出。Xml,Json,二進制,網絡或文件
- 分表分庫。常見拆分邏輯
- 高級統計。聚合統計,分組統計
- 批量寫入。批量插入,批量Upsert,異步保存
- 實體隊列。寫入級緩存,提升性能。
- 備份同步。備份數據,恢復數據,同步數據
- 數據服務。提供RPC接口服務,遠程執行查詢,例如SQLite網絡版
- 大數據分析。ETL抽取,調度計算處理,結果持久化