2

シリアライゼーションに BinaryFormatter を使用する大量のコードを継承したので、デバッグする必要があります。現在、すべてのシリアル化コードは IFormatter を想定しています。

BinaryFormatter を XmlSerializer に置き換えて、シリアル化された出力を簡単に調べられるようにするというアイデアがありましたが、互換性がありません (共通のベースまたはインターフェイスがありません)。

これに対する標準的なアプローチはありますか?たとえば、パラメーターをコードで使用できる汎用シリアライザーのようなものにしますか? 理想的には、最上位で必要な具体的なシリアライザーを作成し、下位レベルで具体的な型を知る必要なくそれを渡したいと思います。

私が現在持っているものの例:

BinaryFormatter bformatter = new BinaryFormatter();     //create a binary formatter
PutPw(bformatter, stream, panel.DevicePassword);    //encode and stream the password

public static void PutPw(IFormatter bf, Stream stream, string pw)
{
    ...
    bf.Serialize(stream, pw);
}
4

2 に答える 2

3

すでに指摘したように、バイナリ シリアライズ可能なすべてのオブジェクトが XML シリアライズ可能でもあるわけではありません (たとえば、TimeSpan を使用するもの)。

しかし、そのかなり深刻な欠陥に対処できるのであれば、おそらく私がとるアプローチは、独自のインターフェースを作成することです。次に、それを実装する 2 つのクラスを用意します。1 つはバイナリ フォーマッタをラップし、もう 1 つは XML シリアライザをラップします。作業を楽にするために、アプリが使用するメソッド名とパラメーターの点でバイナリ フォーマッタと非常によく似たインターフェイスを用意して、具体的なバイナリ フォーマッタの出現箇所を比較的簡単に置き換えることができるようにします。

于 2012-12-20T18:15:58.443 に答える
1

チェックしましたSoapFormatterか?XmlSerializer のように読みやすくはありませんが、それでも XML であり、ほとんどの値を理解できます。また、BinaryFormatter と同様に、IFormatter から継承します。そのため、コードに触れる必要なく に変更できます。
さらに、XmlSerializer はパラメーターなしのコンストラクターを持つオブジェクトのパブリック プロパティのみを処理できますが、IFormatters はリフレクションで動作し、パラメーター化されたコンストラクターでプライベート フィールドとオブジェクトを処理できます。さらに、この属性Serializableは XmlSerializer ではなく、フォーマッターでのみ機能します。これは根本的に異なり、多くのコードを変更する必要がある場合があります。

于 2012-12-20T19:36:22.873 に答える