簡體   English   中英

如何測試 scala 類的 kryo 反序列化不兼容性

[英]How to test scala classes for kryo deserialization incompatibility

我想使用 kryo 來序列化和反序列化類的層次結構,如下所示:

case class Apple(bananas: Map[String, Banana], color: Option[String])
case class Banana(cherries: Seq[Cherry], countryOfOrigin: String)
case class Cherry(name: Option[String], age: Int, isTomato: Boolean)

有時我想在此層次結構中的某處添加和刪除字段,例如Cherry

我想編寫一個單元測試,查看從Apple開始的類型層次結構,並得出結論,之前使用 kryo 序列化的數據將無法正確反序列化——即反序列化的 object 不會==到序列化的 object,如果我可以同時擁有memory 同時。

在那種情況下,我可以更新我的 Redis 緩存中的命名空間鍵,忘記所有舊數據並從頭開始重建它。 我只需要一個自動提醒,以便我在需要時記得這樣做。

一些誤報是可以接受的; 假陰性不是。 我很樂意將諸如串行版本 UID 之類的東西硬編碼到我的測試用例中,並在我更改底層 class 層次結構時更新它。 如果測試僅適用於 DAG 形層次結構,這是可以接受的,但處理周期絕對是受歡迎的。

是否有某種方法可以通過使用例如TypeTag機制來遍歷類型層次結構的描述來計算我想要的位? kryo 兼容性究竟取決於源類型聲明的哪些方面,以及如何使用TypeTag來表示這些功能?

我使用io.altoo.akka.serialization.kryo.KryoSerializer進行(反)序列化,參見https://github.com/altoo-ag/akka-kryo-serialization

我在這方面使用的一個技巧是檢查樣本(ScalaCheck 及其生成器在這里可能很有用)用舊序列化的“重要”版本序列化的數據。 然后您編寫測試,從字面上檢查新序列化是否正確反序列化。

您可能會遇到壓力很大的開發人員通過更改序列化數據來改變誰使反序列化測試綠色(這發生在我身上)。 您可以通過檢查序列化測試數據的校驗和並在 CI 開始時驗證它們來解決這個問題:更改這些校驗和應該在審查中非常明顯,因為有問題正在發生。

我懷疑這種方法比重新實現 kryo 的類型系統的一部分並找出一種方法來序列化該類型系統的表示以與未來版本的代碼進行比較的替代方法會有更好的回報。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM