簡體   English   中英

F#:如何使用 Newtonsoft.Json 反序列化私有歧視聯合?

[英]F#: How to deserialize a private discriminated union with Newtonsoft.Json?

2018 年的問答中Onur Gumus使用 [<JsonObject(MemberSerialization = MemberSerialization.Fields)>] 來啟用具有私有構造函數的可區分聯合的序列化/反序列化。

"對我來說,序列化如宣傳的那樣工作,但反序列化會產生以下錯誤:“

有誰知道如何讓反序列化工作? 如果可以避免,我不想切換到類類型。 但是,我已經嘗試找出放置 JsonConstructor 屬性的位置,但沒有任何運氣。 我還嘗試傳遞一個ConstructorHandling值設置為 AllowNonPublicDefaultConstructor 的設置值,但這沒有任何改變。

為方便起見,我在這里復制 Onur 的解決方案:

open Newtonsoft.Json
[<JsonObject(MemberSerialization = MemberSerialization.Fields)>]
type Foo =  private Bar of string
let f = Bar "f"
let s = JsonConvert.SerializeObject(f)
let f2 = JsonConvert.DeserializeObject<Foo>(s)

printf "%A" f2

萬一重要(因為自 2018 年以來事情似乎發生了變化),我正在使用 .NET 5。

我有理由確定你偶然發現了一個錯誤。

當我將您引用的示例代碼復制到 LINQPad v6.13.13 中並運行時,它運行良好。 然后我嘗試用另一個屬性替換該屬性 - 我在評論中提到的那個。 沒想到沒有編譯。 所以我只是恢復到原來的屬性。 然后我遇到了與您遇到的相同的編譯錯誤。 那不應該發生。 這是一個錯誤。 但是哪里?

進一步調查顯示,如果我在 LINQPad 中執行以下操作,則會錯誤地產生編譯錯誤:

  1. 從文件中打開代碼片段,然后嘗試運行它。 這編譯並運行良好。
  2. 注釋掉該屬性,然后嘗試運行它。 這會產生有問題的編譯錯誤。 這是應該的。
  3. 帶回屬性,並嘗試運行它。 這當然應該編譯並運行良好,因為源現在與步驟 1 中的一樣,但它仍然會產生有問題的編譯錯誤。

重復嘗試相同的步驟會產生相同的問題,無論我是否在兩次運行之間重新啟動 LINQPad。

然后我嘗試用 Visual Studio 重現這個問題。 我沒有成功 - 在 VS 16.10.3 中沒有這樣的問題

我現在沒有更多時間,但稍后會繼續調查。 我想用最新的 LINQPad 測試版來檢查一下。

至於你的問題,是這個原因嗎?

更新

我現在已經檢查了當前的測試版 LINQPad v6.14.10。 該錯誤不存在於那里。 我並不感到意外。 正如我在評論中提到的,編譯器是我的主要嫌疑人。 更是如此,因為你告訴你 VSCode 有問題。 但還有一個更有趣的細節。

LINQPad 使用一個非常舊版本的 F# 編譯器服務已經有很長時間了,因為有一個錯誤阻止了它的更新。 LINQPad 的創建者 Joseph Albahari 最近迫不及待地等待修復此錯誤,並找到了解決方法。 該修復程序僅在測試版中。 F# 編譯器服務版本的巨大飛躍自然意味着許多錯誤已得到修復,很可能也是這個錯誤。

我不打算進一步探討這個問題。 我不使用 VSCode,但如果即使在最新的 REPL 中也存在這個問題,那么也許有人應該調查一下。

暫無
暫無

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

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