序列化也叫做編碼,是指將物件轉換成位元組陣列,用於在網路傳輸,資料持久化。
反序列化也叫作解碼,是指將位元組陣列還原成原始物件,以方便進行後續的業務邏輯操作。
序列化方式
1. 文字類序列化方式,json ,xml
2.二進位制序列化方式,protobuf,thrift
序列化方式和通訊協議是解耦的。同一種通訊協議可以有多種序列化方式承載。
比如http協議,序列化方式可以是xml,可以是json,也可以是附件等二進位制。
官方文件以及網上很多文章提到 protobuf 可模擬 xml 或 json。
那麼 protobuf 是否就等同於 xml 和 json 呢,它們是否具有完全相同的應用場景呢?
個人認為如果要將 protobuf、xml、json 三者放到一起去比較,應該區分兩個維度。乙個是資料結構化,乙個是資料序列化。這裡的資料結構化主要面向開發或業務層面,資料序列化面向通訊或儲存層面,當然資料序列化也需要「結構」和「格式」,所以這兩者之間的區別主要在於面向領域和場景不同,一般要求和側重點也會有所不同。資料結構化側重人類可讀性甚至有時會強調語義表達能力,而資料序列化側重效率和壓縮。
從這兩個維度,我們可以做出下面的一些思考。
xml 作為一種擴充套件標記語言,json 作為源於 js 的資料格式,都具有資料結構化的能力。
例如 xml 可以衍生出 html (雖然 html 早於 xml,但從概念上講,html 只是預定義標籤的 xml),html 的作用是標記和表達全球資訊網中資源的結構,以便瀏覽器更好的展示全球資訊網資源,同時也要盡可能保證其人類可讀以便開發人員進行編輯,這就是面向業務或開發層面的資料結構化。
再如 xml 還可衍生出 rdf/rdfs,進一步表達語義網中資源的關係和語義,同樣它強調資料結構化的能力和人類可讀。
json 也是同理,在很多場合更多的是體現了資料結構化的能力,例如作為互動介面的資料結構的表達。在 mongodb 中採用 json 作為查詢語句,也是在發揮其資料結構化的能力。
當然,json、xml 同樣也可以直接被用來資料序列化,實際上很多時候它們也是這麼被使用的,例如直接採用 json、xml 進行網路通訊傳輸,此時 json、xml 就成了一種序列化格式,它發揮了資料序列化的能力。但是經常這麼被使用,不代表這麼做就是合理。實際將 json、xml 直接作用資料序列化通常並不是最優選擇,因為它們在速度、效率、空間上並不是最優。換句話說它們更適合資料結構化而非資料序列化。
扯完 xml 和 json,我們來看看 protobuf,同樣的 protobuf 也具有資料結構化的能力,其實也就是上面介紹的 message 定義。我們能夠在 .proto 檔案中,通過 message、import、內嵌 message 等語法來實現資料結構化,但是很容易能夠看出,protobuf 在資料結構化方面和 xml、json 相差較大,人類可讀性較差,不適合上面提到的 xml、json 的一些應用場景。
但是如果從資料序列化的角度你會發現 protobuf 有著明顯的優勢,效率、速度、空間幾乎全面佔優,看完後面的 protobuf 編碼的文章,你更會了解 protobuf 是如何極盡所能的壓榨每一寸空間和效能,而其中的編碼原理正是 protobuf 的關鍵所在,message 的表達能力並不是 protobuf 最關鍵的重點。所以可以看出 protobuf 重點側重於資料序列化而非 資料結構化。
最終對這些個人思考做一些小小的總結:
xml、json、protobuf 都具有資料結構化和資料序列化的能力
xml、json 更注重資料結構化,關注人類可讀性和語義表達能力。protobuf 更注重資料序列化,關注效率、空間、速度,人類可讀性差,語義表達能力不足(為保證極致的效率,會捨棄一部分元資訊)
protobuf 的應用場景更為明確,xml、json 的應用場景更為豐富。
序列化和反序列化 C 序列化與反序列化。
序列化介紹 把物件用一種新的格式來表示。系列化只序列化資料。序列化不建議使用自動屬性 為什麼要序列化 將乙個複雜的物件轉換流,方便儲存與資訊交換。class program class person public int age 二進位制序列化 就是將物件變成流的過程,把物件變成byte class...
序列化和反序列化
先定義乙個類 serializable xmlroot shintech public class person set public string name set public person this 0,string.empty public person int m age,string m...
序列化和反序列化
引文來自 序列化和反序列化我們可能經常會聽到,其實通俗一點的解釋,序列化就是把乙個物件儲存到乙個檔案或資料庫欄位中去,反序列化就是在適當的時候把這個檔案再轉化成原來的物件使用。using system using system.collections using system.text namesp...