Я использовал двоичную сериализацию, чтобы сохранить запись F # из класса C#. Все работает отлично:Двоичная сериализация изменчивой записи F #
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:
Даже доступ к записи с помощью методов, как предложил @ Брайан, кажется, не работает.
Вот еще несколько деталей. Когда я десериализация предыдущего сохраненного объекта таким образом (который работает без game_state заявило изменяемый):
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
Я думаю, что вы имели в виду, чтобы написать 'пусть изменяемые game_state = aGameState() ' вместо 'пусть изменяемые game_state <- aGameState() ' –
@John Палмер: хорошо, хорошо. Но это не проблема. – Heisenbug
Является ли сама запись изменчивой, или она является неизменной записью, хранящейся в изменяемой переменной? Ваш пример показывает только последний ... –