2015-11-12 2 views
0

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

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() 
     { 
      //... 
     } 
    } 
} 

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

SerializationException был необработанное

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

Дополнительная информация: 'WindowsFormsApplication1, Version = 1.0.0.0, Культура = нейтральная, PublicKeyToken = null' Derlemesindeki 'WindowsFormsApplication1.MyPanel' ...

+0

Я полагаю, что эти элементы управления не отмечены как [Serializable], что означает, что они не могут быть сериализованы BinaryFormatter. Какова ваша цель? Почему вы хотите сериализовать элементы управления? – Camo

+0

На самом деле, мне просто нужно сохранить id и deviceNumber. этого должно быть достаточно. Контролирует, что вы имеете в виду ярлык панели и т. Д. Мне не нужно держать, что я могу создать снова при загрузке. –

+0

Почему вы используете 'ArrayList'? Это так 10 лет назад. Почему бы не использовать 'List '? – Enigmativity

ответ

0

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

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