我认为需要自定义反序列化。但是,在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”方法中的代码由设计者生成,不应手动修改。请删除所有更改并尝试再次打开设计器。
你如何让设计者在尝试解析它并放弃之前使用你的反序列化方法?