2011-07-19 7 views
2

コードベースでは、保存する必要のあるクラスはすべてIXmlSerializableです。つまり、すべてがパブリックなパラメータなしコンストラクタを持つことを意味します。シリアル化からのみ呼び出されるコンストラクタを実装する

この問題は、これらのインスタンスの特定のメンバーがプライベートで必須であるため、すべての「使用可能な」コンストラクタを呼び出すときに必要となるため、それぞれを「シリアル化目的のみ」にする必要があります。

「このコンストラクタは、シリアライゼーションコード/アセンブリによって呼び出される必要があります。それ以外の場合は、私は爆発するつもりです。誰かがこれを行う良い方法がある場合は知っていますか?なぜあまりにも高価に聞こえる彼らは唯一の方法私はこれを考えることができ、コールスタックを確認している...

答えて

2

方法について:

[Obsolete("Is your name XmlSerializer? No, I didn't think so.", true)] 
    public Foo() { } 

注:このが反射から、またはジェネリックからあなたを保護しませんwhere T : new()という制約がありますが、より多くの可能性のあるnew Foo()シナリオは回避されます。

+0

xmlシリアル化では、廃止とマークされたプロパティは無視されます。それはコンストラクタと同じですか? – bottlenecked

+1

@ボトルネックを確認しました。それはうまく動作します。 –

+0

これはいつものようにきれいです。ありがとうMarc :) – Ian

1

私はあなたのために別の解決策を持っています:あなたのクラスの「プライベート」コンストラクタを移動してserialization surrogateを使用してください。そうすれば、あなたの魔法のコンストラクタはシリアル化プロセス自体の一部として使用されることはありません。

+0

私はこれがXmlSerializationだと述べました。私はあなたがXmlでサロゲートを使用できるかどうかはわかりません。 – Ian

+0

XmlSerializationは、データコントラクトでは可能ですが、この方法を使用することはできません。ごめんなさい。 –

関連する問題