簡體   English   中英

Kotlin 數據 class Jackson 序列化/反序列化相同 ZA8CFDE6331BD59EB2666F8911ZB4 失敗

[英]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.

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