基於泛型編程的序列化實現方法

2021-03-02 阿里云云棲號

這裡使用的std::istringstream和std::ostringstream即是分別從字符串流中恢復數據以及將類對象的數據轉儲到字符串流中。

對於類MyFilter和MyVideo則使用相同的方式,即分別增加一個友元模板函數serialize的實現即可,至於std::list模板類,boost已經幫我們實現了。

這時我們發現,對於每一個定義的類,我們需要做的僅僅是在類內部聲明一個友元模板函數,同時類外部實現這個模板函數即可,對於後期類的成員變量的修改,如增加、刪除或者重命名成員變量,也僅僅是修改一個函數即可。

Boost序列化庫已經足夠完美了,但故事並未結束!

在用於端上開發時,我們發現引用Boost序列化庫遇到了幾個挑戰

端上的編譯資料很少,官方對端上編譯的資料基本沒有,在切換不同的版本進行編譯時經常會遇到各種奇怪的編譯錯誤問題

Boost在不同的C++開發標準之間兼容性不夠好,尤其是使用libc++標準進行編譯連結時遇到的問題較多

Boost增加了端上發行包的體積

Boost每次序列化都會增加序列化庫及版本號等私有頭信息,反序列化時再重新解析,降低了部分場景下的使用性能

基於泛型編程的序列化實現方法

為了解決使用Boost遇到的這些問題,我們覺得有必要重新實現序列化庫,以剝離對Boost的依賴,同時能滿足如下要求

為了兼容現有使用Boost的代碼以及保持當前開發者的習慣,同時使用代碼修改的重構的工作量最小,我們應該保留模板函數serialize,同時對於模板函數內部的實現,為了提高效率也不需要對各成員變量重新打包,即直接使用如下定義

相關焦點

  • 原來C語言還可以這樣實現「泛型編程」!
    在回答標題問題之前,先了解下什麼是泛型編程。泛型編程(generic programming)是程序設計語言的一種風格或範式。泛型允許程式設計師在強類型程序設計語言中編寫代碼時使用一些以後才指定的類型,在實例化時作為參數指明這些類型。
  • 跟我學Java編程—理解Java泛型概念
    在泛型出現之前,這種現象在編程中會經常發生,因為有時程式設計師在獲取集合元素時,並不能夠完全明確集合中存儲的是屬於什麼類型的元素。那麼有什麼辦法可以讓裝入集合容器的數據保存自己的類型,而不被轉化為Object對象呢?這就需要用到JDK 5.0後支持的一項新功能——Java泛型。
  • 在S7-1200/1500中實現泛型
    泛型是高級程式語言的一種特性。
  • Java 泛型詳解-絕對是對泛型方法講解最詳細的,沒有之一
    本文參考java 泛型詳解、Java中的泛型方法、 java泛型詳解概述泛型在java中有很重要的地位,在面向對象編程及各種設計模式中有非常廣泛的應用。什麼是泛型?為什麼要使用泛型?泛型,即「參數化類型」。一提到參數,最熟悉的就是定義方法時有形參,然後調用此方法時傳遞實參。那麼參數化類型怎麼理解呢?
  • 支付寶面試:什麼是序列化,怎麼序列化,為什麼序列化,反序列化會遇到什麼問題,如何解決?
    然後就是,還和上面的操作差不多,先是單獨執行序列化方法。生成文件。然後,打開屬性 addTip ,這之後,再次執行反序列化方法,看現象。第四種:當屬性是對象的時候,沒實現序列化接口當屬性是對象的時候,如果這個對象,沒實現序列化接口,那麼上面的方法在序列化的時候就在執行
  • 泛型:泛型的定義(類、接口、對象)、使用、繼承
    顯然,泛型使編程更加通用,並且代碼也更加簡潔,代碼更加容易維護;2.實現/繼承泛型接口/泛型類:    1) 定義泛型和使用泛型的概念:主要區別就是定義和使用         i. 那Java的方法做類比,Java的方法在定義的時候使用的都是形參(虛擬參數),但是在調用方法(使用方法)的時候必須傳入實參;         ii.
  • 淺談 C++ 元編程
    由於元編程不同於一般的編程,在程序設計上更具有挑戰性,所以受到了許多學者和工程師的廣泛關注。1.4 元編程的語言支持C++ 的元編程主要依賴於語言提供的模板機制。除了模板,現代 C++ 還允許使用 constexpr 函數進行常量計算。由於 constexpr 函數功能有限,所以目前的元編程程序主要基於模板。
  • 文庫 | 反序列化漏洞匯總
    尤其是當使用具有二進位序列化格式的語言時,開發人員可能會認為用戶無法有效讀取或操縱數據。但是,儘管可能需要付出更多的努力,但攻擊者仍有可能利用二進位序列化的對象,就象利用基於字符串的格式一樣。由於現代網站中存在大量依賴關係,因此基於反序列化的攻擊也成為可能。一個典型的站點可能會實現許多不同的庫,每個庫也都有自己的依賴性。
  • 【深度好文】一篇文章告訴你如何使用Java泛型?
    答案是肯定的。Java 中的 ArrayList 就是做這件事的一種類。泛型編程模式(Generic Programming Paradigm)和 面向對象編程(OOP)混合在一起時,就很難決定是否要使用泛型。理解在哪裡應用泛型,問題就解決了一半。本文就將帶你了解一些典型的泛型用例,包括其使用場景,也可以讓你在遇到同類型問題時能夠合理應用泛型。
  • [譯]聊聊C#中的泛型的使用
    類型參數使得設計某些類和方法成為可能,例如,通過使用泛型類型參數T,可以大大簡化類型之間的強制轉換或裝箱操作的過程(裝箱、拆箱問題)。說白了,泛型就是通過參數化類型來實現在同一份代碼上操作多種數據類型,利用「參數化類型」將類型抽象化,從而實現靈活的復用。每個集合的詳細規範可以在System.Collection.Generic名稱空間下找到。
  • 如何從零學習一門程式語言,並由此拿到高薪?
    有必要談談的是:如何由淺入深的學習一門程式語言?學習所有程式語言有沒有一個相對統一的學習方法?為此,我特意請教了一位資深程式設計師大咖,希望能給正準備入門編程的同學一些參考。這位程式設計師接觸過不少程式語言:Java、Python、Javascript、C、C++、Shell等等。
  • Java泛型的特點與優缺點,泛型擦除是怎麼回事?
    Java 是如何支持泛型的?底層實現?是否了解 Java 泛型的特點,優缺點?是否了解泛型擦除?考察的知識點Java 是如何支持泛型的?底層實現機制是什麼?在泛型的初始實現中,編譯器將強制類型轉換(沒有泛型的話,程式設計師會指定這些強制類型轉換)插入生成的字節碼中。但是更多類型信息可用於編譯器這一事實,為未來版本的 JVM 的優化帶來可能。由於泛型的實現方式,支持泛型(幾乎)不需要 JVM 或類文件更改。所有工作都在編譯器中完成,編譯器生成類似於沒有泛型(和強制類型轉換)時所寫的代碼,只是更能確保類型安全而已。
  • Java程式設計師:推薦9本Java編程書籍
    它涵蓋了有關類、對象、線程、集合和語言功能的基本Java編程知識,如泛型、枚舉、變量參數或自動裝箱。還有一些關於Swing、網絡和Java IO的高級部分,如果你從頭開始,這應該是你看到的第一本Java書。
  • 什麼是序列化,怎麼序列化,為什麼序列化,反序列化會遇到什麼問題,如何解決.
    然後執行後面的序列化和反序列化的方法。直接報錯。拋異常:NotSerializableException這個太暴力啦,不推薦這麼幹。然後就是,還和上面的操作差不多,先是單獨執行序列化方法。生成文件。第四種:當屬性是對象的時候,沒實現序列化接口當屬性是對象的時候,如果這個對象,沒實現序列化接口,那麼上面的方法在序列化的時候就在執行oos.writeObject(flyPig)時候,報錯了「Exception in thread 「main」 java.io.NotSerializableException
  • 掃盲:Kotlin 的泛型
    泛型方法又是什麼?今天,就用一篇文章為大家解除上述疑惑。泛型:類型安全的利刃總所周知,Java 在 1.5 之前,是沒有泛型這個概念的。那時候的 List 還只是一個可以裝下一切的集合。由於 Java 的泛型本身是一種 「偽泛型」,Java 為了兼容 1.5 以前的版本,不得以在泛型底層實現上使用 Object 引用,所以我們聲明的泛型在編譯時會發生「類型擦除」,泛型類型會被 Object 類型取代。
  • 多範式程式語言-以Swift為例
    但 Swift 可以實現多個協議(Java 中對應的是接口 Interface)。這在一定程度上彌補了沒有多繼承的局限,同時又避免了多繼承難以控制的缺陷。除了實現協議,Swift 還可以實現多個擴展(Extension)。擴展是一種向已有的類,枚舉或者結構體添加新功能的方法。
  • Python之數據序列化(json、pickle、shelve)
    但是,系統內部的轉換協議通常會隨著程式語言版本的升級而發生變化(改進算法、提高效率),因此通常會涉及轉換協議與程式語言的版本兼容問題,下面要介紹的pickle協議就是這樣一個例子。  3. 序列化/反序列化  將對象轉換為可通過網絡傳輸或可以存儲到本地磁碟的數據格式(如:XML、JSON或特定格式的字節串)的過程稱為序列化;反之,則稱為反序列化。
  • 左耳聽風系列之編程範式
    本章導航地圖:1.什麼是編程範式?編程範式:Programming Paradigm。即模範的意思,範式即方式、方法,是一種典型的編程風格。說白了就是指從事軟體工程的一種方法論。C 語言的這些特性,可以讓程式設計師在微觀層面寫出非常精細和精確的編程操作,讓程式設計師可以在底層和系統細節上非常自由、靈活和精準地控制代碼。2.泛型編程泛型編程來源於C語言中對於各種數據類型的適配問題,對類型的抽象,這就是所謂的泛型編程。
  • 計算機泛型
    計算機中的概念:泛型允許程式設計師在強類型語言中編寫代碼時定義一些可變部分,那些可變部分必須做出指明。比如:開發者在定義一個List接口的實現類時xxxList,當實現xxxList時,有些開發者不知道未來中怎麼向容器中存儲什麼類型的數據,這時候就需要該容器存儲更多,更廣泛的類型,所以可聲明為泛型。