具有基于控件的属性的c#类序列化

具有基于控件的属性的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; 
    } 
} 
+0

您的预期结果是什么?如果序列化和反序列化一个PanelGroup对象,你是否期望ElementControl为null?或者您是否期望将所有相关属性设置为匹配预序列化值? –

您有几个选项。最简单的方法是在你的ElementControl属性上放置一个[NonSerialized]属性,这意味着当你序列化你的PanelGroup时它会被跳过。这会导致您在反序列化和重新设置属性时丢失ElementControl的值。

另一种选择是手动序列化对象(请参阅here),但这可能需要大量工作。

像往常一样,当遇到这种问题时,最好的选择是重构它。非控制类真的没有理由在其中有一个控制类的实例。您的域代码(意思是您创建的用于表示真实概念的自定义类)应与您的用户界面分开。您可能需要具有代表稍后重新创建控件所需的所有数据的属性,但您可以在不依赖于任何特定于UI的实现详细信息(如Control类)的情况下执行此操作。

+0

如果我按照你的说法重构它,那么我必须维护另一个对象模型,以便管理UI事件,如“OnDragDrop”,“OnDragOver”等,并且此控件集合和对象(PanelGroup等)集合之间必须存在关系。 – Tim

+0

这是正确的 - 你将有一个单独的模型负责UI逻辑,而这个类代表域或业务逻辑。他们之间可能有一些关系,但这种分离整体上仍然更好。查看MVP,MVC,MVVM模式,了解相同根概念的一些示例。 –