Я использовал двоичную сериализацию для сохранения записи F # из класса C #. Все отлично работает:
F #:
type GameState =
{
LevelStatus : LevelStatus
Grid : Variable<Option<Ball> [,]>
...
}
let game_state : GameState = aGameState()
C #:
public void OnSaveGame() {
using (var stream = File.Open("game_status.sav", FileMode.Create))
{
var binary_formatter = new BinaryFormatter();
binary_formatter.Serialize(stream, PuzzleBobble.game_state);
}
}
Теперь я выполняю рефакторинг своего модуля F # и хотел бы иметь изменяемую запись для сериализации:
let mutable game_state = aGameState()
game_state <- myGameState()
Таким образом, файл создается, но когда я пытаюсь десериализовать его, я получаю нулевой объект.
Я ничего не изменил в своей предыдущей реализации, кроме добавленного ключевого слова mutable.
Мой вопрос: есть ли что-то не так с сериализацией изменяемой записи F #? Или сериализация сама по себе верна, и я должен искать другую ошибку где-то еще в моем коде?
EDIT:
Даже доступ к записи с помощью методов, подобных предложенному @Brian, кажется, не работает.
Вот еще несколько деталей. Когда я десериализирую предыдущий сохраненный объект таким образом (это работает без game_state, объявленного mutable):
public void OnLoadGame() {
using (var stream = File.Open("game_status.sav", FileMode.Open))
{
var binary_formatter = new BinaryFormatter();
try
{
GameLogic.GameState state = binary_formatter.Deserialize(stream) as GameLogic.GameState;
GameLogic.load_game_state(state);
}
catch (ArgumentNullException e) {
Console.WriteLine(e.Message);
}
}
}
Я получаю следующее исключение:
«System.ArgumentNullException» в файле FSharp.Core.dll