【发布时间】:2020-10-13 14:31:36
【问题描述】:
我正在尝试反序列化 MainWindow 中边框控件的 Opacity 属性
public MainWindow()
{
InitializeComponent();
Serialization.DeSerialize(this);
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("OffOpacity", Off.Opacity);
}
public MainWindow(SerializationInfo info, StreamingContext context)
{
Off.Opacity = (double)info.GetValue("OffOpacity", typeof(double));
}
这是反序列化方法:
public static void DeSerialize(MainWindow M)
{
try
{ var binaryIO = new BinaryFormatter();
using (Stream stream = File.Open(@"./History.dat", FileMode.Open))
{
M = (MainWindow)binaryIO.Deserialize(stream);
}
}catch(Exception e) { }
}
在 InitializeComponent(); 之后我检查了 Off 并且它不为空。在 Serialization.DeSerialize(this); 运行并调用获取值的构造函数后,Off 出于某种原因变为 null,并在尝试获取值时给了我一个 nullreference 错误。
【问题讨论】:
-
您正在混合状态和数据,并且正在使用不会像这样工作的引用(在另一个函数中分配 M 不会影响您传递的
this)。基本上,您的表单在InitializeComponent()之后启动并运行,它具有运行时状态,并且(MainWindow)binaryIO.Deserialize(stream)返回的反序列化表单还没有调用其InitializeComponent(),因此它的Off成员中没有实例。 -
你是说,当我们设置M等于反序列化的形式时,首先运行的构造函数,不是执行InitializeComponent()的构造函数;但是获得价值的那个?
-
反序列化时,不运行构造函数。你不能像那样序列化表单。
-
public MainWindow(SerializationInfo info, StreamingContext context) 在我们执行反序列化方法之后运行,它从 info 中获取值并将它们分配给属性。这不是构造函数吗?虽然,因为它没有 InitializeComponent();它给了我一个空引用。我想我必须包含它才能解决问题?
-
是的,BinaryFormatter 在它正在反序列化的实例上调用 that 构造函数,但这不会影响您从中调用
Serialization.DeSerialize(this)的 MainWindow。
标签: c# wpf serialization