5

次のように実装されたプロパティを持つオブジェクトがあります

public String Bla {get;set;} 

実装を次のようなものに変更した後

private String _bla;

public String Bla
{
    get { return _bla; }
    set { _bla = value; } 
} 

デシリアライズ時に、このプロパティは空になります。

古い実装からのシリアル化されたデータがたくさんあり、新しい実装でそれらをロードしたいと思います

古いバイナリファイルと互換性があるようにインペンションを変更する方法はありますか?

編集:

一部の人々は同じ問題に遭遇するかもしれないので、これが私のハックな解決策です:

自動生成されたフィールドには、無効なc#コードである命名規則があります。

[CompilerGenerated]
private string <MyField>k__BackingField;

[CompilerGenerated]
public void set_MyField(string value)
{
    this.<MyField>k__BackingField = value;
}

[CompilerGenerated]
public string get_MyField()
{
    return this.<MyField>k__BackingField;
}

私にとっての迅速で汚い修正はxMyFieldxK__BackingField、ソースで呼び出されるプライベートバッキングフィールドを作成することでした。

シリアル化されたbinarydataにパッチを適用するために、すべてのオカレンスを<MyField>xMyFieldxシリアライズ前にに置き換えます

4

2 に答える 2

2

実装してみてくださいISerializable

    [SecurityCritical]
    public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        if (info == null)
            throw new ArgumentNullException("info");

        info.AddValue("name of compiler generated field", _bla);
    }
于 2012-12-05T14:53:16.347 に答える
1

プロパティではBinaryFormatterなく、フィールドをシリアル化します。

自動生成されたフィールド名がILSpyなどで何であるかを確認し、そのように名前を付けることで、機能させることができます。

それ以外の場合、Henrikが述べているように、独自の逆シリアル化を作成する必要があります。詳細については、この質問を参照してください。

ISerializableこのフィールドを実装して特殊なケースにすることで、おそらく逆シリアル化情報を調べることができます。

于 2012-12-05T16:10:54.593 に答える