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