2011-12-19 5 views
4

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

+0

Я думаю, что вы имели в виду, чтобы написать 'пусть изменяемые game_state = aGameState() ' вместо 'пусть изменяемые game_state <- aGameState() ' –

+0

@John Палмер: хорошо, хорошо. Но это не проблема. – Heisenbug

+0

Является ли сама запись изменчивой, или она является неизменной записью, хранящейся в изменяемой переменной? Ваш пример показывает только последний ... –

ответ

1

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

Если изменить код, чтобы определить

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

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

+0

извините. Кажется, это не сработает. Я редактировал вопрос. – Heisenbug

 Смежные вопросы

  • Нет связанных вопросов^_^