我正在尝试序列化一个数据结构,这涉及一些有区别的联合和记录。在某些时刻,为了提高性能(它是一个科学计算项目),我试图将参与结构的一些类型改为.NET结构。但是,在一个特殊情况下,我的检查点已经破坏,这是基于BinaryFormatter
。
将[<Struct>]
添加到我的一条记录后,它们开始在序列化中失败,并在反序列化时显示以下消息:TypedReferences中的字段不能是静态的,也不能是init。
因为,我只能找到将[<CLIMutable>]
添加到该记录的建议,以使其字段不再是readonly
。然而,出乎意料的是,这没有帮助。
我设法将示例缩小到这个范围:
module BinSerializer =
type Node = Leaf | Node of Node * Node
[<Struct>]
[<CLIMutable>]
type Struct = { Term: byte; Node: Node }
type Uni = A | B | S of Struct
open System.IO
open System.Runtime.Serialization.Formatters.Binary
let fail() =
let formatter = BinaryFormatter()
use stream = new MemoryStream()
formatter.Serialize(stream, S({ Term = 0uy; Node = Leaf }))
stream.Flush()
stream.Position <- 0L
formatter.Deserialize(stream) |> ignore
BinSerializer.fail()
删除[<Struct>]
可让呼叫成功。从Node
删除Struct
字段。
F#4.1针对.NET 4.7.1 + FSharp.Core 4.4.3