2011-12-19 10 views
4

バイナリシリアル化を使用して、C#クラスからF#レコードを保存しました。すべてが正常に動作します:可変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() 

このようにファイルが作成されますが、デシリアライズしようとするとnullオブジェクトが生成されます。
追加されたmutableキーワードを除いて、以前の実装では何も変更していません。

私の質問です:可変F#レコードのシリアル化に何か問題はありますか?それとも、シリアル化自体が正しいのですが、コード内の別の場所で別のエラーを探す必要がありますか?

EDIT:

がさえ示唆し@Brianのような方法でレコードにアクセス、動作しないようです。

ここにいくつかの詳細があります。私は以前に保存したオブジェクトをデシリアライズすると、このよう(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); 
      }  


     } 
    } 

私は次の例外を取得:FSharp.Core.dll

'System.ArgumentNullException' を

+0

私はあなたが '可変game_state = aGameState()しましょう 'の代わりに '<可変game_stateを聞かせて書くためのものだと思う - aGameState() ' –

+0

@ジョンパーマー:そうですね。しかし、それは問題ではありません。 – Heisenbug

+0

レコード自体が変更可能か、それとも不変レコードが変更可能な変数に格納されていますか?あなたの例は後者のみを示しています... –

答えて

1

F#ライブラリのモジュールスコープの可変変数が適切に初期化されていない、奇妙なバグがありました。これは可能でしょうか?

あなたは

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

を定義し、取得/設定機能を使用するコードを変更した場合は、代わりに直接変更可能な変数を参照することで、問題が離れて行くのですか?もしそうなら、これは我々が知っているエキゾチックなコンパイラのバグかもしれません。

+0

申し訳ありません。それは動作していないようです。私はその質問を編集した。 – Heisenbug

関連する問題