WPF折线磁盘二进制序列化

WPF Polyline disk binary serialization

在 WPF 中,我需要对具有大量点的折线变量进行二进制序列化。我使用以下代码:

SaveFileDialog sf = new SaveFileDialog();
sf.FileName = "Orig.txt"); 

if (sf.ShowDialog() == true)
{
    FileStream fs = new FileStream(sf.FileName, FileMode.Create);
    BinaryFormatter formatter = new BinaryFormatter();

    try
    {
        formatter.Serialize(fs, plOriginal);
    }
    catch (Exception exc)
    {
        MessageBox.Show("Failed to serialize. Reason: " + exc.Message);
    }

    fs.Close();
}

但我收到错误消息:

System.Runtime.Serialization.SerializationException: Type 'System.Windows.Media.PolyLineSegment' in Assembly 'PresentationCore, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' is not marked as serializable. at System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType type) at System.Runtime.Serialization.FormatterServices.GetSerializableMembers(Type type, StreamingContext context) at System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo() at System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter) at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck)
at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph, Header[] headers, Boolean fCheck)
at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph) at CurveAnalyzerDemoWPF.MainWindow.rbSave_Click(Object sender, RoutedEventArgs e) in MainWindow.xaml.cs:line 92}

所以有什么解决方法可以让它工作吗? 提前谢谢

编辑:我将可序列化属性放在折线变量上:

[Serializable]
private PolyLineSegment plOriginal = new PolyLineSegment();

但是我得到了以下编译错误: 错误 1 ​​属性 'Serializable' 在此声明类型上无效。它仅对 'class, struct, enum, delegate' 声明有效。 F:\C# WPF\CurveAnalyzerDemoWPF\CurveAnalyzerDemoWPF\MainWindow.xaml.cs 55 4 CurveAnalyzerDemoWPF

这条消息是不言自明的。要使用二进制格式器目标 class 必须用 [Serializable] 属性标记。我建议您序列化数据而不是第 3 方 class 实例。 您可以使用 [Serialiable] 属性创建自己的 class 来存储点坐标,从中构建折线并在需要时更新其数据。然后只需序列化您自己的 class.

CS:

public partial class MainWindow : Window
{
    PolyLineData dataStorage = new PolyLineData();

    public MainWindow()
    {
        InitializeComponent();
        PopulateFromXaml();
        SaveToFile();
        LoadFromFile();
        PopulateToXaml();
    }

    private void PopulateToXaml()
    {
        polyLine.Points = new PointCollection(dataStorage.Points);
    }

    public void SaveToFile()
    {
        SaveFileDialog sf = new SaveFileDialog();
        sf.FileName = "Orig.txt";
        if (sf.ShowDialog() == true)
        {
            FileStream fs = new FileStream(sf.FileName, FileMode.Create);
            BinaryFormatter formatter = new BinaryFormatter();
            try
            {
                formatter.Serialize(fs, dataStorage);
            }
            catch (Exception exc)
            {
                MessageBox.Show("Failed to serialize. Reason: " + exc.Message);
            }
            fs.Close();
        }
    }

    public void LoadFromFile()
    {
        OpenFileDialog of = new OpenFileDialog();
        if ((bool)of.ShowDialog())
        {
            FileStream fs = new FileStream(of.FileName, FileMode.Open);
            BinaryFormatter bf = new BinaryFormatter();
            dataStorage = bf.Deserialize(fs) as PolyLineData;
            fs.Close();
        }
    }

    public void PopulateFromXaml()
    {
        foreach (var item in polyLine.Points)
        {
            dataStorage.Points.Add(item);
        }
    }

    [Serializable]
    public class PolyLineData
    {
        public List<Point> Points = new List<Point>();
    }
}

XAML:

 <Grid>
    <Polyline Stroke="LightBlue" 
              StrokeThickness="4" 
              Name="polyLine"
              Points="10,150 30,140 50,170 70,120 90,190 110,100 130,210 150,80 170,230 190,60 210,250 230,150 320,150" />
 </Grid>