具有基于控件的属性的c#类序列化
具有称为PanelGroup的类,并且它具有名为ElementControl的属性,其类型为Control。因为我知道控制不是可序列化的,那么有什么建议这个类被序列化的做法?谢谢。具有基于控件的属性的c#类序列化
public class PanelGroup
{
public PanelGroup(FormElementGroupBase parentElement) : base(parentElement)
{
Intialize();
}
public PanelGroup(FormElementGroupBase parentElement, int id, string name, bool isVertical) : base(parentElement, id, name)
{
Intialize();
IsVertical = isVertical;
}
private void Intialize()
{
this.ItemType = DomainItemTypes.PANEL_GROUP;
this.ElementControl = new PanelControl();
this.ElementControl.MinimumSize = new Size(50, 50);
(this.ElementControl as PanelControl).AutoSize = true;
(this.ElementControl as PanelControl).AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
if (ParentElement != null)
{
ParentElement.ElementControl.Controls.Add(this.ElementControl);
};
this.ElementControl.AllowDrop = true;
this.ElementControl.MouseUp += new System.Windows.Forms.MouseEventHandler(this.Control_OnMouseUp);
this.ElementControl.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Control_OnMouseDown);
this.ElementControl.KeyDown += new KeyEventHandler(this.Control_OnKeyDown);
this.ElementControl.DragDrop += new DragEventHandler(OnDragDrop);
this.ElementControl.DragOver += new DragEventHandler(OnDragOver);
}
[Browsable(false)]
public override string NamePrefix
{
get { return "PanelGroup"; }
}
internal sealed override void Highlight()
{
(this.ElementControl as PanelControl).Appearance.BorderColor = SelectionColor;
}
}
您有几个选项。最简单的方法是在你的ElementControl属性上放置一个[NonSerialized]属性,这意味着当你序列化你的PanelGroup时它会被跳过。这会导致您在反序列化和重新设置属性时丢失ElementControl的值。
另一种选择是手动序列化对象(请参阅here),但这可能需要大量工作。
像往常一样,当遇到这种问题时,最好的选择是重构它。非控制类真的没有理由在其中有一个控制类的实例。您的域代码(意思是您创建的用于表示真实概念的自定义类)应与您的用户界面分开。您可能需要具有代表稍后重新创建控件所需的所有数据的属性,但您可以在不依赖于任何特定于UI的实现详细信息(如Control类)的情况下执行此操作。
如果我按照你的说法重构它,那么我必须维护另一个对象模型,以便管理UI事件,如“OnDragDrop”,“OnDragOver”等,并且此控件集合和对象(PanelGroup等)集合之间必须存在关系。 – Tim
这是正确的 - 你将有一个单独的模型负责UI逻辑,而这个类代表域或业务逻辑。他们之间可能有一些关系,但这种分离整体上仍然更好。查看MVP,MVC,MVVM模式,了解相同根概念的一些示例。 –
您的预期结果是什么?如果序列化和反序列化一个PanelGroup对象,你是否期望ElementControl为null?或者您是否期望将所有相关属性设置为匹配预序列化值? –