【问题标题】:How to serialize a control by XMLSerializer in C#如何在 C# 中通过 XMLSerializer 序列化控件
【发布时间】:2019-02-02 11:04:41
【问题描述】:

我正在开发一个应用程序,用户可以将一些控件(按钮、标签和...)动态添加到面板中,然后使用所有添加的控件保存表单。为了保存我使用 XMLSerializer 但它给了我这个错误

无法序列化 System.ComponentModel.ISite 类型的成员 System.ComponentModel.Component.Site,因为它是一个接口。

我想知道如何将控件保存在 XML 文件中?如果不可能,有没有其他方法可以做到这一点?

编辑:已解决

我找到了一个很好的项目,正是我正在寻找的:

Easy Form Design at Run Time C# Windows Forms

谢谢

【问题讨论】:

  • 你不能序列化一个接口。您是否尝试序列化实现接口的类而不是接口本身?

标签: c# xml-serialization xmlserializer


【解决方案1】:

控件有许多属性。当你创建一个控件时,你只设置了一些属性,其余的保持默认。您只需保存指定的属性。

创建一个类来存储所需的属性:

public class ControlValueObject
{
    public string Type { get; set; }
    public string Text { get; set; }
    public int Top { get; set; }
    public int Left { get; set; }
    // Add the properties you need
}

然后创建这些对象的集合并序列化它:

var label = new Label { Text = "Sample", Top = 10, Left = 20 };
var button = new Button { Text = "Click", Top = 40, Left = 20 };

panel.Controls.Add(label);
panel.Controls.Add(button);

var controls = panel.Controls.OfType<Control>()
    .Select(c => new ControlValueObject { Type = c.GetType().Name, Text = c.Text, Left = c.Left, Top = c.Top })
    .ToList();

var ser = new XmlSerializer(controls.GetType());
ser.Serialize(stream, controls);

如何进行反序列化,我想,你会猜到的。

【讨论】:

  • 非常感谢。我将测试这个解决方案并分享结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-10
  • 1970-01-01
相关资源
最近更新 更多