gpt4 book ai didi

c# - 反序列化为 UI

转载 作者:太空狗 更新时间:2023-10-29 21:46:53 25 4
gpt4 key购买 nike

我有一个程序集,其中包含几个我希望能够通过应用程序 UI 保存/加载的 UserControl 对象。为此,每个控件都实现了 ISerializable 接口(interface)来自定义它们需要保存的字段。

这是该库的简化版本:

namespace LibraryProject
{
using System;
using System.Runtime.Serialization;
using System.Windows.Forms;

[Serializable]
public partial class UserControl1 : UserControl, ISerializable
{
public UserControl1()
{
InitializeComponent();
}

public UserControl1(SerializationInfo info, StreamingContext ctxt)
: this()
{
this.checkBox1.Checked = info.GetBoolean("Checked");
}

public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("Checked", this.checkBox1.Checked);
}
}
}

客户端应用程序实例化其中的几个控件,并允许用户保存/加载各种 UserControl 配置。这是该应用程序的简化版本:

namespace ApplicationProject
{
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Soap;
using System.Windows.Forms;
using LibraryProject;

public partial class Form1 : Form
{
private const string filename = @"test.xml";

//int hash1;
//int hash2;

public Form1()
{
InitializeComponent();

//hash1 = this.ctrl1.GetHashCode();
}

private void SaveClick(object sender, EventArgs e)
{
using (var stream = File.Open(filename, FileMode.Create))
{
var formatter = new SoapFormatter();

formatter.Serialize(stream, this.ctrl1);
}
}

private void LoadClick(object sender, EventArgs e)
{
using (var stream = File.Open(filename, FileMode.Open))
{
var formatter = new SoapFormatter();

this.ctrl1= (UserControl1)formatter.Deserialize(stream);
}

//hash2 = this.ctrl1.GetHashCode();
}
}
}

SaveClick 上,值被正确保存到文件中。在 LoadClick 上,CheckBox.Checked 在 Debugger Watch 列表中正确更新,但 UI 未反射(reflect)新值。

我尝试添加对 Refresh() 的调用, Invalidate() , Update() , 但似乎没有任何效果。

正如预期的那样,hash1hash2 是不同的,但是Form1 使用了正确的实例。

我做错了什么,如何修复 UI 以显示正确的(更新的)值?

编辑:另外,请注意我需要处理多个配置文件,用户必须能够保存/加载到/从她选择的路径

最佳答案

我偷偷怀疑 UI 没有更新,因为它还不可见。我发现将 visible 属性设置为 false 的控件有时会出现问题。

您最好以某种结构化格式序列化数据,然后使用那个 来实例化控件并填充控件。像这样的东西(未经测试):

public class UserControlData
{
public string Type { get; set; } // or assembly qualified type
public List<ControlValue> ControlValues { get; set; }
}

public class ControlValue
{
public string Name { get; set; }
public object Value { get; set; }
}

public interface IControlPersistence
{
List<ControlValue> GetControlValues();
void SetControlValues(List<ControlValue> controlValues);
}

然后序列化/反序列化用户控制数据并根据定义实例化和设置值。在您实例化并添加用户控件后,它可以独立于实例化更新其控件值 --- 甚至仅在它可见时(如果最终成为问题)。

我还建议包装 XmlSerializer 并将其用于序列化(可能类似于 IObjectSerializer/XmlObjectSerializer : IObjectSerializer)。

希望这是有道理的。

关于c# - 反序列化为 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6553661/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com