1

m_settings変数を揮発性レコードから永続レコードに移動しようとしています。[serializable]クラスに属性を追加m_settingsし、BinaryFormatter を使用して変数をファイル ストリームに送信しようとしましたが、エラーが発生しましたthe file cannot be written, access to the file is denied。私は何を間違っていますか?

[Serializable] 
public class SettingsComponent : GH_Component
{
    public SettingsComponent(): base("LoadSettings", "LoadSettings", "Loading ini", "Extra", "Silkworm") { }


    public override void CreateAttributes()
    {
        m_attributes = new SettingsComponentAttributes(this);
    }


    string m_settings_temp;
    string[] m_settings;
    public void ShowSettingsGui()
    {
        var dialog = new OpenFileDialog { Filter = "Data Sources (*.ini)|*.ini*|All Files|*.*" };
        if (dialog.ShowDialog() != DialogResult.OK) return;

        m_settings_temp = File.ReadAllText(dialog.FileName);
        m_settings = m_settings_temp.Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
        ExpireSolution(true);
    }



    protected override void SolveInstance(IGH_DataAccess DA)
    {
        if (m_settings == null)
        {
           AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "You must declare some valid settings");
           return;
        }
        else
        {  
                    FileStream fs = new FileStream("DataFiletemp.dat", FileMode.Create);
                    BinaryFormatter formatter = new BinaryFormatter();
                    try
                    {
                        formatter.Serialize(fs, m_settings);
                    }
                    catch (SerializationException e)
                    {
                        Console.WriteLine("Failed to serialize. Reason: " + e.Message);
                        throw;
                    }
                    finally
                    {
                        fs.Close();
                    }

                   DA.SetDataList(0, m_settings);
        }  

    }
4

1 に答える 1

1

Arthur さん、m_settings オブジェクトが複雑でない場合は、プロジェクト設定 (アプリケーションまたはユーザー レベル) を使用できます。一部のプロジェクト設定を app.config に保存する方法のサンプル コードを次に示します。

     [YourNamespace].Properties.Settings.Default["MyProperty"] = "Demo Value";
     [YourNamespace].Properties.Settings.Default.Save();

また、バイナリのシリアル化が必要な場合は、次のようなコードを使用できます: (シリアル化されたオブジェクトと継承のオブジェクトは、シリアル化可能としてマークする必要があります)

    /// <summary>
    /// Serializes object to file
    /// </summary>
    /// <param name="data"></param>
    /// <param name="FilePath"></param>
    public static void SerializeMyObject(object data, string FilePath)
    {
        System.IO.Stream stream = null;
        try
        {
            stream = System.IO.File.Open(FilePath, System.IO.FileMode.Create);
            System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bformatter =
            new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
            bformatter.Serialize(stream, data);
            stream.Close();
            stream.Dispose();
        }
        catch (Exception ex)
        {
            try
            {
                stream.Close();
                stream.Dispose();
            }
            catch (Exception)
            {
            }
            throw new Exception(ex.Message);
        }
    }
于 2012-09-15T14:17:31.367 に答える