バイナリシリアル化を使用して、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' を
私はあなたが '可変game_state = aGameState()しましょう 'の代わりに '<可変game_stateを聞かせて書くためのものだと思う - aGameState() ' –
@ジョンパーマー:そうですね。しかし、それは問題ではありません。 – Heisenbug
レコード自体が変更可能か、それとも不変レコードが変更可能な変数に格納されていますか?あなたの例は後者のみを示しています... –