你如何反序列化自己的序列化代码? (CodeDomSerializer)

时间:2013-10-16 13:10:13

标签: c# serialization windows-forms-designer codedom

我假设需要自定义反序列化。但是,SerializableExpandoObjectCodeDomSerializer中的反序列化方法都不会在此错误发生之前运行。

如何反序列化自己的序列化代码?


我正在序列化作为动态对象的组件的属性。可以在设计时在属性网格中添加,删除和更改属性和值。

此课程完美地延续了设计时间的变化:

class SerializableExpandoObjectCodeDomSerializer : CodeDomSerializer
{
    public override object Serialize(IDesignerSerializationManager manager, object value)
    {
        var expandoObject = (SerializableExpandoObject)value;
        var expandoObjectExpression = base.GetExpression(manager, value);

        return new CodeStatementCollection(
            expandoObject.GetDynamicMemberNames()
            .Select(name => new CodeAssignStatement(
                new CodePropertyReferenceExpression(expandoObjectExpression, name), base.SerializeToExpression(manager, (object)expandoObject[name])))
            .ToArray()
        );
    }

    public override object Deserialize(IDesignerSerializationManager manager, object codeObject)
    {
        MessageBox.Show("Never runs.");
        return base.Deserialize(manager, codeObject);
    }

    protected override object DeserializeInstance(IDesignerSerializationManager manager, Type type, object[] parameters, string name, bool addToContainer)
    {
        MessageBox.Show("Never runs.");
        return base.DeserializeInstance(manager, type, parameters, name, addToContainer);
    }
}

导致this.autoSerializer.Options对象的序列化设计器代码:

// 
// autoSerializer
//
this.autoSerializer.Options.Test = "1";
this.autoSerializer.Options.AnotherSetting = "Chart";
this.autoSerializer.CalculateLayoutID += new System.EventHandler<Techsola.Controls.CalculateLayoutIDEventArgs>(this.autoSerializer1_CalculateLayoutID);
this.autoSerializer.ComponentLayoutLoaded += new System.EventHandler<Techsola.Controls.LayoutLoadedEventArgs>(this.autoSerializer_ComponentLayoutLoaded);

当设计师关闭并重新打开时,如果保存了任何属性,则会显示:

  

设计人员无法在第129行处理代码:   this.autoSerializer.Options.Test =“1”;方法中的代码   'InitializeComponent'由设计者生成,不应该   手动修改。请删除所有更改,然后尝试打开   设计师再次。

如何让设计人员在尝试解析并放弃之前使用反序列化方法?

0 个答案:

没有答案