//Загрузка примитивов из файла public void LoadFromFile(string path) { BinaryFormatter formatter = new(); WorkSpaceObjects workSpaceObject = CreateWorkSpaceObject(); try { FileStream fs = new FileStream(path, FileMode.Open); #pragma warning disable SYSLIB0011 workSpaceObject = (WorkSpaceObjects)formatter.Deserialize(fs); fs.Close(); #pragma warning restore SYSLIB0011 } catch (Exception ex) { MessageBox.Show(ex.Message); } //Добавление примитивов на рабочую область try { DrawFromFile(workSpaceObject); } catch (Exception ex) { MessageBox.Show(ex.Message); } }
//Сохранение рабочей области в файл public void SaveToFile(string path) { WorkSpaceObjects workSpaceObject = CreateWorkSpaceObject(); try { for (int i = 0; i < WorkSpace.Children.Count; i++) { AddValuesToWorkSpaceObject(workSpaceObject, WorkSpace.Children[i] as Shape); } } catch (Exception ex) { MessageBox.Show(ex.Message); } FileStream fs = new(path, FileMode.Create); try { BinaryFormatter formatter = new(); //Новый стандарт для защиты от уязвимости рекомендует сериализацию только в xml и json. #pragma warning disable SYSLIB0011 formatter.Serialize(fs, workSpaceObject); fs.Close(); #pragma warning restore SYSLIB0011 } catch (Exception ex) { MessageBox.Show(ex.Message); } }
//Добавление примитивов в рабочую область из WorkSpaceObjects private void DrawFromFile(WorkSpaceObjects workSpaceObject) { for (int i = 0; i < workSpaceObject.shapeType.Count; i++) { Color color; if (workSpaceObject.shapeType[i].CompareTo(typeof(Rectangle).ToString()) == 0) { color = SetColor(workSpaceObject.borderBrush[i]); Rectangle rect = CreateRectangle(workSpaceObject.position[i], new SolidColorBrush(color), workSpaceObject.thickness[i]); Rotate(rect, workSpaceObject.rotateAngle[i]); color = SetColor(workSpaceObject.fillBrush[i]); Fill(rect, color); } else if (workSpaceObject.shapeType[i].CompareTo(typeof(Polyline).ToString()) == 0) { color = SetColor(workSpaceObject.borderBrush[i]); Polyline polyline = AddLine(workSpaceObject.polylinePoints[i][0], new SolidColorBrush(color), workSpaceObject.thickness[i]); for (int j = 1; j < workSpaceObject.polylinePoints[i].Count; j++) { AddPointToLine(polyline, workSpaceObject.polylinePoints[i][j]); } } } WorkSpace.InvalidateMeasure(); }
//Заполнение структуры WorkSpaceObject private static void AddValuesToWorkSpaceObject(WorkSpaceObjects workSpaceObject, Shape currentShape) { string figureTypeString; SolidColorBrush brush; MyColor myColor; workSpaceObject.height.Add(currentShape.Height); workSpaceObject.width.Add(currentShape.Width); workSpaceObject.thickness.Add(currentShape.StrokeThickness); brush = currentShape.Stroke as SolidColorBrush; myColor = SetMyColor(brush.Color); workSpaceObject.borderBrush.Add(myColor); if (currentShape.GetType() == typeof(Rectangle)) { figureTypeString = typeof(Rectangle).ToString(); workSpaceObject.shapeType.Add(figureTypeString); workSpaceObject.polylinePoints.Add(null); double angle = GetRotationAngle(currentShape); workSpaceObject.rotateAngle.Add(angle); workSpaceObject.position.Add(GetPosition(currentShape)); brush = currentShape.Fill as SolidColorBrush; myColor = SetMyColor(brush.Color); workSpaceObject.fillBrush.Add(myColor); } else if (currentShape.GetType() == typeof(Polyline)) { figureTypeString = typeof(Polyline).ToString(); workSpaceObject.shapeType.Add(figureTypeString); workSpaceObject.rotateAngle.Add(0); List <Point> polylinePoints = new(); for (int j = 0; j < ((Polyline)currentShape).Points.Count; j++) { polylinePoints.Add(((Polyline)currentShape).Points[j]); } workSpaceObject.polylinePoints.Add(polylinePoints); workSpaceObject.position.Add(new Rect(0, 0, 0, 0)); myColor = SetMyColor(Colors.Transparent); workSpaceObject.fillBrush.Add(myColor); } }