2

Serializer と呼ばれる、C# でシリアル化を処理するクラスがあります。その実装は次のとおりです。

public class Serializer
{
    public void SerializeRulesManager(string filename, RulesManager rulesManager)
    {
        Stream stream = File.Open(filename, FileMode.Create);        
        try
        {
            BinaryFormatter binaryFormatter = new BinaryFormatter();
            binaryFormatter.Serialize(stream, rulesManager);             
        }
        finally
        {
            stream.Close();
        }                
    }

    public RulesManager DeserializeRulesManager(string filename)
    {
        RulesManager rulesManager = null;
        Stream stream = File.Open(filename, FileMode.Open);
        try
        {
            BinaryFormatter binaryFormatter = new BinaryFormatter();
            rulesManager = (RulesManager)binaryFormatter.Deserialize(stream);                
        }
        finally
        {
            stream.Close();                
        }                       
        return rulesManager;
    }
}    

非常に簡単なもので、すべての単体テストで問題なく動作します。RulesManager は正しくシリアライズおよびデシリアライズされているため、グラフが適切であることがわかります。

問題は次のコードで発生します。

public void Save(string filename)
{
    Cursor.Current = Cursors.WaitCursor;
    try
    {
        _serializer.SerializeRulesManager(filename, _rulesManager);
    }
    catch (System.Exception ex)
    {
        MessageBox.Show(ex.Message);
    }            
    finally
    {
        Cursor.Current = Cursors.Default;
    }
}

その関数は Manager クラスの一部です。Manager クラスは MainForm でインスタンス化されます。MainForm は SaveFileDialog を使用して、保存先のファイル名と場所をユーザーに要求し、次の呼び出しを行います。

saveFileDialog.InitialDirectory = Path.GetDirectoryName(Application.ExecutablePath);
if (saveFileDialog.ShowDialog(this) == DialogResult.OK)
{
    _manager.Save(saveFileDialog.FileName);
}

したがって、上記の関数を呼び出します。そうすると、Serialize.SerializeRulesManager の binaryFormatter.Serialize(stream, rulesManager) 行で次の例外が発生します。

アセンブリ 'TestHarness, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' のタイプ 'TestHarness.MainForm' は、シリアル化可能としてマークされていません。

MainForm をシリアライズ可能としてマークする必要があるのはなぜですか? 念のため、MainForm に Serializable 属性を設定し、例外を 1 つ上のレベルに移動して、Windows.Form が Serializable としてマークされていないことを示しました。何を与える?

4

1 に答える 1

5

RulesManager はおそらく MainForm への参照を持っています。その場合は、 NonSerializedAttrbibuteでシリアル化されていないとマークし ます。

于 2009-09-29T21:27:50.123 に答える