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

C# 如何反序列化自己的序列化代码?(CodeDomSerializer),c#,serialization,windows-forms-designer,codedom,C#,Serialization,Windows Forms Designer,Codedom,我认为需要自定义反序列化。但是,在发生此错误之前,SerializableExpandoObjectCodeDomSerializer中的反序列化方法均未运行 如何反序列化自己的序列化代码 我正在序列化作为动态对象的组件的属性。可以在设计时在特性网格中添加、删除和更改特性和值 此类可以完美地保存设计时更改: class SerializableExpandoObjectCodeDomSerializer : CodeDomSerializer { public override obj

我认为需要自定义反序列化。但是,在发生此错误之前,
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);
//
//自动序列化器
//
this.autoSerializer.Options.Test=“1”;
this.autoSerializer.Options.AnotherSetting=“Chart”;
this.autoSerializer.CalculateLayoutID+=新系统.EventHandler(this.autoSerializer1\u CalculateLayoutID);
this.autoSerializer.ComponentLayoutLoaded+=新的System.EventHandler(this.autoSerializer\u ComponentLayoutLoaded);
关闭并重新打开设计器时,如果保存了任何属性,将显示:

设计器无法处理第129行的代码: this.autoSerializer.Options.Test=“1”;方法中的代码 “InitializeComponent”由设计器生成,不应 手动修改。请删除任何更改,然后尝试打开 又是设计师


在设计器尝试解析并放弃之前,您如何让它使用您的反序列化方法?

很难猜测您是如何让序列化程序运行的。这通常需要类上的[DesignerSerializer]属性,不能更改ExpandooObject的属性。我怀疑这就是问题的核心。我应该澄清,尽管
SerializableExpandoObject
提供了与
ExpandoObject
类似的功能,但它直接源自
DynamicObject