ArrayList исключения сериализации объектов в C#

У меня есть ArrayList, который состоит из множества созданных мной объектов. Я пытаюсь сохранить это. Насколько я понимаю, лучшим решением для этого является использование двоичного форматера. Но что-то не так с моим кодом. Это не работает ни написание, ни на чтение. Вот мой код;

namespace WindowsFormsApplication1
{
   public partial class Form1 : Form
   {
      private ArrayList allList = new ArrayList();    
      private FileStream fileStream;
      private MemoryStream memoryStream;

      public Form1()
      {
          InitializeComponent();
          fileStream = new FileStream("pcdata.dat",FileMode.OpenOrCreate,FileAccess.ReadWrite);
          memoryStream = new MemoryStream();
      }
      public void acceptDevice(Device receivedDevice)
      {
          //Somehow I call this method
          allList.Add(receivedDevice);
          saveDeviceDataToFileStream();
      }
      private void saveDeviceDataToFileStream()
      {
          SerializeToStream(allList).WriteTo(fileStream);
      }
      private void loadDeviceDataFromFileStream()
      {
          fileStream.CopyTo(memoryStream);
          allList = (ArrayList)DeserializeFromStream(memoryStream);
      }
      public static MemoryStream SerializeToStream(object o)
      {
          MemoryStream stream = new MemoryStream();
          IFormatter formatter = new BinaryFormatter();
          formatter.Serialize(stream, o);
          return stream;
      }
      public static object DeserializeFromStream(MemoryStream stream)
      {
          IFormatter formatter = new BinaryFormatter();
          stream.Seek(0, SeekOrigin.Begin);
          if (null == stream)
          {
             return null;
          }
          object o = formatter.Deserialize(stream);
          return o;
    }
  }
}

Это мой класс устройства:

namespace WindowsFormsApplication1
{
    [Serializable]
    public class Device
    {
        public MyPanel panel;           //panel class that I created
        public String id;
        public int deviceNumber;

        public Device(String id, int deviceNumber)
        {
            panel = new MyPanel();
            this.id = id;
            this.deviceNumber = deviceNumber;
        }
    }
}

И это класс myPanel:

namespace WindowsFormsApplication1
{
    public class MyPanel : TableLayoutPanel
    {
        public Panel panel1 = new Panel();
        public Panel panel2 = new Panel();
        public Panel panel3 = new Panel();
        public Panel panel4 = new Panel();
        public PictureBox pictureBox1 = new PictureBox();
        public Label nameLabel = new Label();
        public MyPanel()
        {
            //...
        }
    }
}

Это оно. Когда я попытался настроить его, я получил это исключение:

Исключение SerializationException было обработано

Произошло необработанное исключение типа "System.Runtime.Serialization.SerializationException" в mscorlib.dll

Дополнительная информация: "WindowsFormsApplication1, версия =1.0.0.0, культура = нейтральная, PublicKeyToken=null" Derlemesindeki ", WindowsFormsApplication1.MyPanel"...

1 ответ

Решение

Я не думаю, что вы сможете просто так сериализовать элементы управления. Я бы предложил создать классы вокруг данных, которые вы хотите сохранить, и сделать элементы управления ответственными только за отображение.

[Serializable]
public class MyPanelInfo 
{
    public PanelInfo panel1;
    public PanelInfo panel2;
    public PanelInfo panel3;
    public PanelInfo panel4;
    public Image image;
    public string nameLabel;

    public MyPanelInfo()
    {

    }
}

[Serializable]
public class PanelInfo
{
    public string id;
    public string name;
}
Другие вопросы по тегам