私たちのソフトウェアで作成したすべてのカスタムドキュメントを開くことができるビューアを開発しています。すべてのドキュメントはIDocumentから継承していますが、デシリアライズの方法についてはわかりません(ネストされたtry/catchはうまくいくかもしれませんが、それは恐ろしいことでしょう)。実行時に複数の(不明なタイプ)にキャストする
だから、次のようになりますされて、私の方法は:
public Boolean OpenDocument(String filename, Type docType, out IDocument document)
{
// exception handling etc. removed for brevity
FileStream fs = null;
BinaryFormatter bFormatter = new BinaryFormatter();
fs = new FileStream(filename, FileMode.Open);
document = (docType)bFormatter.Deserialize(fs);
return true;
}
私はそのように変数のDOCTYPEを使用することはできませんとして明らかにこれは動作しませんが、私はそれがどのようなIのポイントを示していると思いますやろうとしている。それについて正しい方法は何でしょうか?
編集> [OK]を@ジョン 、多分私は別の質問追加する必要があります。
public interface IDocument
{
public Int32 MyInt { get; }
}
とクラス::私はインターフェイスがあれば を私はIDocumentにデシリアライズ場合
public class SomeDocType : IDocument
{
protected Int32 myInt = 0;
public Int32 MyInt { get { return myint; } }
public Int32 DerivedOnlyInt;
}
を、 DerivedOnlyIntはオブジェクトの一部になります。つまり、デシリアライズ後にSomeDocTypeにキャストしても問題ありません。
私はシリアル化関数をラップするための一般的なアプローチを使用します。これが最善の方法です。IMHO – JoshBerke
とてもいいです。この場合、呼び出し元は(openfiledialogのファイル拡張子を介して)文書タイプを知っています。ありがとうJon –
@ジョンこれはXmlSerializationのために動作していないようです。私は質問と答えを得ることができたが動作するが、少しkludgy感じ、私たちは何かが欠けている:http://stackoverflow.com/questions/1145791/xml-object-deserialization-to-interface – ahsteele