0

私はバイナリ シリアライゼーションに関するガイド (これはこちら: http://www.codeproject.com/Articles/1789/Object-Serialization-using-C ) に従ってきましたが、最終的にはほとんど機能していると思います。保存するとファイルが作成されますが、ロードしようとすると何もロードされません。私はこれを機能させることに近づいているように感じます。アドバイスをいただければ幸いです。コードは次のとおりです。

クラスの保存/ロード

[Serializable()]
public class SaveLoad : ISerializable
{
    public int GameDay = Date.GameDay;
    public List<Adventurer> Adventurers = FormMain.AdventurerManager.AdventurerList;

    public SaveLoad()
    {
        GameDay = 0;
        Adventurers = null;
    }

    public SaveLoad(SerializationInfo info, StreamingContext ctxt)
    {
        GameDay = (int)info.GetValue("Date", typeof(int));
        Adventurers = (List<Adventurer>)info.GetValue("Adventurers", typeof(List<Adventurer>));
    }

    public void GetObjectData(SerializationInfo info, StreamingContext ctxt)
    {
        info.AddValue("Date", GameDay);
        info.AddValue("Adventurers", Adventurers);
    }
}

保存/読み込み方法:

    void btnSaveGame_Click(object sender, EventArgs e)
    {
        SaveLoad save = new SaveLoad();

        Stream stream = File.Open("SaveGame.osl", FileMode.Create);
        BinaryFormatter bformatter = new BinaryFormatter();

        bformatter.Serialize(stream, save);
        stream.Close();
    }

    void btnLoadGame_Click(object sender, EventArgs e)
    {
        SaveLoad load = new SaveLoad();

        Stream stream = File.Open("SaveGame.osl", FileMode.Open);
        BinaryFormatter bformatter = new BinaryFormatter();

        load = (SaveLoad)bformatter.Deserialize(stream);
        stream.Close();

        Date.CalculateDate();

        this.Visible = false;
        ((FormMain)(this.ParentForm)).ControlMainScreen.Visible = true;
    }
4

2 に答える 2

1

初期化のタイミングに問題がある可能性があると思います。

GameDay と Adventurers の初期化をコンストラクターに移動するか、コンストラクターでそれらを無効にすることをやめてください。以下を実行すると、コードはほとんど機能します。

public SaveLoad()
{
    //GameDay = null;
    //Adventurers = null;
}

Adventurer クラスに Serialization 属性があることも確認する必要があったことに注意してください。

これは、私のために機能するシリアライゼーションを含むコードです (私は独自の Adventurer クラスを作成する必要があり、日付を文字列に置き換えました。なぜなら、あなたがそれで何をしているのか、どこから来たのかを理解できなかったからです。私も冒険者リストにいくつかのダミーデータを入力し、私も情報を持っていなかったフォームに関するものをコメントアウトしました.

[Serializable()]
public class SaveLoad : ISerializable
{
    public string GameDay = null;
    public List<Adventurer> Adventurers = null; 
        //FormMain.AdventurerManager.AdventurerList;

    public SaveLoad()
    {
        GameDay = "Date";
        Adventurers = new List<Adventurer>() { new Adventurer { Name = "a1", Type = "t1" }, new Adventurer { Name = "a1", Type = "t1" } }; ;
    }

    public SaveLoad(SerializationInfo info, StreamingContext ctxt)
    {
        GameDay = (string)info.GetValue("Date", typeof(string));
        Adventurers = (List<Adventurer>)info.GetValue("Adventurers", typeof(List<Adventurer>));
    }

    public void GetObjectData(SerializationInfo info, StreamingContext ctxt)
    {
        info.AddValue("Date", GameDay);
        info.AddValue("Adventurers", Adventurers);
    }
}
[Serializable()]
public class Adventurer
{
    public string Name { get; set; }
    public string Type { get; set; }
}

private void btnLoadGame_Click(object sender, EventArgs e)
    {
        SaveLoad sl = new SaveLoad();

        Stream stream = File.Open("SaveGame.osl", FileMode.Open);
        BinaryFormatter bformatter = new BinaryFormatter();

        sl = (SaveLoad)bformatter.Deserialize(stream);
        stream.Close();

        MessageBox.Show(sl.Adventurers.Count.ToString());
        //Date.CalculateDate();

        //this.Visible = false;
        //((Form1)(this.ParentForm)).ControlMainScreen.Visible = true;

    }

    private void btnSaveGame_Click(object sender, EventArgs e)
    {
        SaveLoad sl = new SaveLoad();

        Stream stream = File.Open("SaveGame.osl", FileMode.Create);
        BinaryFormatter bformatter = new BinaryFormatter();

        bformatter.Serialize(stream, sl);
        stream.Close();

    }
于 2013-05-10T00:21:45.850 に答える
0

編集

@JasonHaleyは正しいです。タイミング/初期化の問題があります。

Loadボタンのクリックイベント中に、「Load」と呼ばれる新しいSaveLoadを定義します

これにより、 FormMain.AdventurerManager.AdventurerList への参照が作成されます

しかし、デシリアライズ中に、この参照はディスクにシリアライズされたオブジェクト (冒険者の他のリスト) によって破棄され、FormMain.AdventurerManager.AdventurerList で定義されたものとは異なる冒険者のリストになります。

具体的にそのリストにロードする必要があります...

void btnLoadGame_Click(object sender, EventArgs e)
{
    Stream stream = File.Open("SaveGame.osl", FileMode.Open);
    BinaryFormatter bformatter = new BinaryFormatter();

    SaveLoad load = (SaveLoad)bformatter.Deserialize(stream);
    // ***********************************
    FormMain.AdventurerManager.AdventurerList = SaveLoad.Adventurers
    // ***********************************

    stream.Close();

    Date.CalculateDate();

    this.Visible = false;
    ((FormMain)(this.ParentForm)).ControlMainScreen.Visible = true;
}
于 2013-05-10T00:01:24.463 に答える