Двоичная сериализация изменяемой записи F # - PullRequest
4 голосов
/ 20 декабря 2011

Я использовал двоичную сериализацию для сохранения записи 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

1 Ответ

1 голос
/ 20 декабря 2011

Я однажды видел странную ошибку, когда изменяемые переменные в библиотеках F # не были правильно инициализированы, возможно ли, что вы нажали это?

Если вы измените код для определения

let getGameState() = game_state
let setGameState(x) = game_state <- x

и затем использовать функции get / set вместо прямой ссылки на переменную, проблема исчезнет? Если это так, то это может быть экзотическая ошибка компилятора, о которой мы знаем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...