F # serialization: поле в TypedReferences не может быть статическим или только init - PullRequest
0 голосов
/ 11 мая 2018

Я пытаюсь сериализовать структуру данных, которая включает в себя пару различающихся союзов и записей.В какой-то момент, чтобы повысить производительность (это научный вычислительный проект), я попытался изменить некоторые типы, участвующие в структуре, на структуры .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

...