c#类序列化,属性基于Control

时间:2016-06-10 16:27:13

标签: c# serialization controls

让类名为PanelGroup,它具有名为ElementControl的属性,其类型为Control。我知道Control不是Serializable,那么建议将这个类序列化?感谢。

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;
    }
}

1 个答案:

答案 0 :(得分:0)

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

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

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