2

カスタムのデシリアライゼーションが必要だと思います。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' 内のコードはデザイナーによって生成されるため、手動で変更しないでください。変更をすべて削除して、デザイナーをもう一度開いてみてください。

デザイナーが解析を試みてあきらめる前に、どのようにしてデシリアライゼーション メソッドを利用させるのでしょうか?

4

0 に答える 0