F#序列化:TypedReferences中的字段不能是static或init

时间:2018-05-11 00:28:37

标签: f# binaryformatter

我正在尝试序列化一个数据结构,这涉及一些有区别的联合和记录。在某些时刻,为了提高性能(它是一个科学计算项目),我试图将参与结构的一些类型改为.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

0 个答案:

没有答案