docfx組件介紹--YamlSerialization

  在docfx中把元數據以yaml的形式保存,在metadata階段會序列化數據到yaml文件中,在build階段又須要從yaml文件反序列化出來。在使用過程當中,意外發現yamldotnet在處理大量強類型數據時性能奇差,將yaml反序列化爲弱類型後,再序列化爲json,再從json反序列化爲強類型,這樣看起來超級折騰的3步走居然比yaml直接反序列化爲強類型的性能足足提升了3倍。。。無奈之下,咱們開始嘗試本身寫個序列化器,因而就有了Microsoft.DocAsCode.YamlSerialization這個project。不過這個project與yamldotnet有如下不一樣:json

  • 這個project依賴yamldotnet,直接使用yamldotnet的底層的yaml格式的讀寫
  • 爲了優化性能,使用了emit,因此致使下面兩個反作用:
    • 只能序列化public的類型和屬性,而yamldotnet能夠處理non-public的類型和數學
    • 因爲emit的特性,在大量數據時性能好,而僅有少許數據時反而性能差
  • 修復了幾個序列化反序列化時碰到的問題:
    • 序列化時,將字符串"true",強制序列化爲"true",而不是yamldotnet的true
    • 反序列化弱類型時,將true反序列化爲boolean類型,而"true"爲字符串類型,而yamldotnet均做爲字符串類型
    • 正確序列化和反序列化單引號或雙引號開頭的字符串
  • 增長可擴展屬性,也就是json.net裏面相似JsonExtensionData
    • 不過爲了簡化代碼的複雜性,不能像json.net那樣發現屬性爲null是自動new一個對象
    • 能夠指定可擴展屬性的前綴
相關文章
相關標籤/搜索