[英]Kotlin data class Jackson serialization/deserialization same object failed
目前我正在研究 Kotlin 項目,我們使用 Jackson 對我們的data class
es 進行序列化/反序列化。 我開始編寫一些單元測試並涵蓋了當創建data class
之后對其進行序列化而不是反序列化時,我收到了不同的對象。
這就是我的意思:
我的數據 class
data class TestEvent(
@JsonProperty("stringProperty")
val stringProperty: String,
@JsonProperty("intProperty")
val intProperty: Int? = null,
@JsonProperty("int32Property")
val int32Property: Int? = null,
@JsonProperty("int64Property")
val int64Property: Long? = null,
@JsonProperty("floatProperty")
val floatProperty: Float? = null,
@JsonProperty("doubleProperty")
val doubleProperty: Double? = null,
@JsonProperty("byteProperty")
val byteProperty: ByteArray? = null,
@JsonProperty("booleanProperty")
val booleanProperty: Boolean? = null,
@JsonProperty("dateProperty")
val dateProperty: java.time.LocalDate? = null,
@JsonProperty("dateTimeProperty")
val dateTimeProperty: java.time.OffsetDateTime? = null,
@JsonProperty("uuidProperty")
val uuidProperty: java.util.UUID? = null
)
考試
class SerializationTest {
private lateinit var mapper: ObjectMapper
@Before
fun setup() {
mapper = ObjectMapper()
.registerModule(KotlinModule())
.registerModule(JavaTimeModule())
.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
.setSerializationInclusion(JsonInclude.Include.NON_NULL)
}
@Test
fun testJacкsonDeserialize() {
val testEvent = createTestEvent()
val serializedEvent = mapper.writeValueAsString(testEvent)
val deserializedEvent = mapper.readValue(serializedEvent, TestEvent::class.java)
Assert.assertEquals(testEvent, deserializedEvent)
}
fun createTestEvent() = TestEvent(
stringProperty = "Test event",
intProperty = 12,
int32Property = 34,
int64Property = 54L,
floatProperty = 12.0f,
doubleProperty = 566.0,
byteProperty = byteArrayOf(3, 5, 7, 9),
booleanProperty = false,
dateProperty = LocalDate.of(2020, 1, 20),
dateTimeProperty = OffsetDateTime.of(LocalDate.of(2020, 1, 20), LocalTime.of(10, 0, 10), ZoneOffset.UTC),
uuidProperty = UUID.fromString("2dd41a88-bf52-42ba-8ab9-d202139582ee")
)
}
運行測試后收到此異常:
java.lang.AssertionError: expected:
TestEvent<TestEvent(stringProperty=Test event, intProperty=12, int32Property=34, int64Property=54, floatProperty=12.0, doubleProperty=566.0, byteProperty=[3, 5, 7, 9], booleanProperty=false, dateProperty=2020-01-20, dateTimeProperty=2020-01-20T10:00:10Z, uuidProperty=2dd41a88-bf52-42ba-8ab9-d202139582ee)> but was:
TestEvent<TestEvent(stringProperty=Test event, intProperty=12, int32Property=34, int64Property=54, floatProperty=12.0, doubleProperty=566.0, byteProperty=[3, 5, 7, 9], booleanProperty=false, dateProperty=2020-01-20, dateTimeProperty=2020-01-20T10:00:10Z, uuidProperty=2dd41a88-bf52-42ba-8ab9-d202139582ee)>
Expected :TestEvent<TestEvent(stringProperty=Test event, intProperty=12, int32Property=34, int64Property=54, floatProperty=12.0, doubleProperty=566.0, byteProperty=[3, 5, 7, 9], booleanProperty=false, dateProperty=2020-01-20, dateTimeProperty=2020-01-20T10:00:10Z, uuidProperty=2dd41a88-bf52-42ba-8ab9-d202139582ee)>
Actual :TestEvent<TestEvent(stringProperty=Test event, intProperty=12, int32Property=34, int64Property=54, floatProperty=12.0, doubleProperty=566.0, byteProperty=[3, 5, 7, 9], booleanProperty=false, dateProperty=2020-01-20, dateTimeProperty=2020-01-20T10:00:10Z, uuidProperty=2dd41a88-bf52-42ba-8ab9-d202139582ee)>
您如何看到這兩個對象是相同的,但是測試失敗了,我認為唯一不同的是 IDE 的比較視圖,它顯示 object 通用標簽后添加了一些空白空間,附上截圖:
我錯過了什么嗎? 你能在這里給個建議嗎?
經過一天的思考和研究實際發生了什么,我發現這篇文章拯救了我:
https://medium.com/asos-techblog/what-you-didnt-know-about-arrays-in-kotlin-d3b20337e4
最重要的部分是:
Kotlin 比較數組的引用,而不是內容。 在 Java class 中, Arrays.equals() 用於檢查內容,而不是參考。 由於我們在這里創建了兩個 arrays,所以它們有不同的引用。
因此,如果您的數據類包含Array
,則必須覆蓋 equals 或使用List
更改它,否則equals
將無法正常工作。
希望這將為某人節省至少一天的時間:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.