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>
在 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>