Search code examples
c#serializationpersistencedeserializationgrasshopper

Writing data to a file by overriding the Write() and Read() methods of a Base Class?


I am trying to write data to a file and the code below includes a writer method which allows to override the write() method of the base class GH_Component. The code compiles with no erros but the data does not get written as planned. What am i doing wrong?

         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);
            }


            public override bool Read(GH_IO.Serialization.GH_IReader reader)
            {
                if (m_settings != null && m_settings.Length > 0)
                {
                    Int32 a = m_settings.Length;
                    reader.TryGetInt32("StringCount", ref a);
                    for (int i = 0; i < m_settings.Length; i++)
                    {
                        reader.TryGetString("String", i, ref m_settings[i]);
                    }
                }
                return base.Read(reader);
            }


            public override bool Write(GH_IO.Serialization.GH_IWriter writer)
            {
                if (m_settings != null && m_settings.Length > 0)
                {
                    writer.SetInt32("StringCount", m_settings.Length);
                    for (int i = 0; i < m_settings.Length; i++)
                    {
                        writer.SetString("String", i, m_settings[i]);
                    }
                }
                return base.Write(writer);
            }



            protected override void SolveInstance(IGH_DataAccess DA)
            {
                if (m_settings == null)
                {
                    AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "You must declare some valid settings");
                    return;
                }
                else
                {
                   DA.SetDataList(0, m_settings);
                }      
            }

Solution

  • I needed to override the Write() and Read() methods on GH_Component:

     //deserializes the variable m_settings to make the data persistant
            public override bool Write(GH_IWriter writer)
            {
                if (m_settings != null && m_settings.Length > 0)
                {
                    writer.SetInt32("StringCount", m_settings.Length);
                    for (int i = 0; i < m_settings.Length; i++)
                    {
                        writer.SetString("String", i, m_settings[i]);
                    }
                }
    
                return base.Write(writer);
            }
    
            //deserializes the variable m_settings to make the data persistant
            public override bool Read(GH_IReader reader)
            {
                m_settings = null;
    
                int count = 0;
                reader.TryGetInt32("StringCount", ref count);
                if (count > 0)
                {
                    System.Array.Resize(ref m_settings, count);
                    for (int i = 0; i < count; i++)
                    {
                        string line = null;
                        reader.TryGetString("String", i, ref line);
                        m_settings[i] = line;
                    }
                }
    
                return base.Read(reader);
            }