gpt4 book ai didi

f# - Newtonsoft 无法反序列化一个空的 F# 序列?

转载 作者:行者123 更新时间:2023-12-05 00:51:36 24 4
gpt4 key购买 nike

使用 Newtonsoft.Json,最新版本 (=6.0.6) 我收到以下错误:


无法创建和填充列表类型 Microsoft.FSharp.Core.CompilerServices.RuntimeHelpers+EmptyEnumerable`1[System.String]

然而在一个post宣布 Newtonsoft.Json 将完全支持 Fsharp 类型?

当我将有问题的类型更改为常规数组时,一切正常。

代码:

type Prescription () = 
member val Id = "" with get, set
member val Status = new PrescriptionStatus() with get, set
member val Prescriber = new Prescriber() with get, set
member val Indications = [||] : string[] with get, set

当我将指示更改为:

    member val Indications = Seq.empty : string seq with get, set

我遇到了错误。

此外,当我将实际上可枚举的数组初始化为数组时,它无法构造:

member val Indications : string seq = [||] |> Array.toSeq with get, set 

最佳答案

我想答案是,Newtonsoft.Json 不完全支持 F# 类型。

但是 F# 并没有使对它们的支持变得特别容易。例如,用 Seq.empty 定义的空序列不只是一个 IEnumerable<T> ,它是一个特定的可枚举实现 EmptyEnumerable<T> ,这似乎会中断序列化——很可能是因为它没有合适的构造函数。从您链接到的帖子:

To all future creators of immutable .NET collections: If your collection of T has a constructor that takes IEnumerable then Json.NET will automatically work when deserializing to your collection, otherwise you're all out of luck.

如果你像这样初始化你的 seq,也许行为会有所不同:

member val Indications = Seq.ofArray [||] : string seq with get, set

但这是吹毛求疵,这里的实际答案很简单——不要序列化 ​​seqs。只需使用具体的、行为良好的类型,如数组。类型越简单,在进行序列化或互操作时让您头疼的可能性就越小。

关于f# - Newtonsoft 无法反序列化一个空的 F# 序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27090943/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com