Сохранение и восстановление изображений, сделанных пользователем в C#
Оказывается, это замечательно легко. Следующий код показывает, как программа сохраняет объекты Polyline, хранящиеся в списке Polylines.
// Сохранить чертеж. private void mnuFileSaveAs_Click(object sender, EventArgs e) { if (sfdFile.ShowDialog() == DialogResult.OK) { XmlSerializer xml_serializer = new XmlSerializer(Polylines.GetType()); using (StreamWriter stream_writer = new StreamWriter(sfdFile.FileName)) { xml_serializer.Serialize(stream_writer, Polylines); stream_writer.Close(); } } }
В коде отображается SaveFileDialog. Если пользователь выбирает файл и нажимает кнопку «Сохранить», программа создает объект XmlSerializer. Он передает конструктору тип вещи, который он будет сериализовать. В этом случае это тип данных переменной Polylines, которая List & lt; Polyline & gt;.
Затем программа создает связанный с этим файл StreamWriter. Он вызывает метод сериализатора Serialize, передавая ему StreamWriter и объект для сериализации.
Следующий код показывает, как программа десериализует сериализованный файл.
// Откройте сохраненный чертеж. private void mnuFileOpen_Click(object sender, EventArgs e) { if (ofdFile.ShowDialog() == DialogResult.OK) { try { XmlSerializer xml_serializer = new XmlSerializer(Polylines.GetType()); using (FileStream file_stream = new FileStream(ofdFile.FileName, FileMode.Open)) { Listnew_polylines = (List ) xml_serializer.Deserialize(file_stream); Polylines = new_polylines; picCanvas.Refresh(); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } }
// Откройте сохраненный чертеж. private void mnuFileOpen_Click (отправитель объекта, EventArgs e) { if (ofdFile.ShowDialog () == DialogResult.OK) { пытаться { XmlSerializer xml_serializer = новый XmlSerializer (Polylines.GetType ()); используя (FileStream file_stream = новый FileStream (ofdFile.FileName, FileMode.Open)) { Список & л; Ломаная & GT; new_polylines = (Список & л; Ломаная & GT;) xml_serializer.Deserialize (file_stream); Полилинии = new_polylines; picCanvas.Refresh (); } } catch (Exception ex) { MessageBox.Show (ex.Message); } } }
...
Затем программа создает файл FileStream, связанный с файлом, открывая его, создавая FileStream.
Затем код вызывает метод Deserialize сериализатора. Результатом является общий объект, поэтому программа передает его в тип List & lt; Polyline & gt;. Наконец, он сохраняет результат в переменной Polylines и обновляет рисунок PictureBox.
Если это были внесенные вами изменения, вы могли бы сохранить и восстановить Polylines, но они не будут иметь свои свойства Цвет. Оказывается, все остальные свойства класса Polyline (int, DashStyl и даже List & lt; Point & gt; ) все сериализуются автоматически, но класс Color не работает. Это означает, что при сериализации списка Polylines их цвета не сохраняются. Когда вы перезагружаете файл, программа рисует Polylines, но вы их не видите, потому что их цвета не перезагружены.
Обходной путь заключается в создании свойства, которое представляет Color, но может быть сериализовано. В этом примере используется свойство с именем Argb, которое получает и устанавливает цветные альфа-, красные, зеленые и синие цветные компоненты цвета в виде комбинированного целого. Целое число может автоматически сериализоваться, чтобы программа работала.
Чтобы избежать небольшого усилия, программа также помещает свойство Color с атрибутом XmlIgnore, поэтому сериализатор полностью игнорирует его.
Ниже показан измененный класс Polyline.
public class Polyline { [XmlIgnore] public Color Color = Color.Black; public int Thickness = 1; public DashStyle DashStyle = DashStyle.Solid; public ListPoints = new List (); // Получить или установить цвет как значение ARGB. public int ToArgb { get { return this.Color.ToArgb(); } set { Color = Color.FromArgb(value); } } public void Draw(Graphics gr) { using (Pen the_pen = new Pen(Color, Thickness)) { the_pen.DashStyle = DashStyle; if (DashStyle == DashStyle.Custom) { the_pen.DashPattern = new float[] { 10, 2 }; } gr.DrawLines(the_pen, Points.ToArray()); } } }