9

さて、これをできるだけ簡潔にすることができるかどうか見てみましょう. 渡されたデータをシリアルobject化するために を内部的に使用するメソッドに、未知の型BinaryFormatterの を渡します (これを選択したのは、データが何であるかわからないため、想像できる最も抽象的なメカニズムです)。 )。そして、メソッドが現在次のようになっていると仮定しましょう:

public void ProvideData(Guid providerKey, ISerializable data, string dataType)...

次に、渡されたものを実際にシリアル化できることを確認する必要があると仮定して、オブジェクトを実装する必要があると考えた理由を考えISerializableてみましょう。ただし、このモデルの問題点の 1 つは、aを実装していないstringにもかかわらず、 astringを渡すことさえできないことです。[Serializable]ISerializable

では、このメソッドを構造化して、単純または複雑に渡された値がシリアライズ可能であることを確認するにはどうすればよいでしょうか?

4

1 に答える 1

12

のIsSerializableプロパティを使用して確認できますType

例えば:

bool canSerialize = myParameter.GetType().IsSerializable;

OP による編集: 最終的な実装方法

以下は、この回答による最終的な実装です(非常に良い回答です)。これは単なるプロトタイプであるため、メソッドで多くのことが行われていませんが、答えは証明されています。注意すべきことの 1 つは、インターフェイスの存在を確認しても値が保持されないことです。これは、オブジェクトを実装する必要がISerializableあるかどうかを試行してシリアル化するまでわからないため、間違ったパスを下っていたからです。ISerializable

ありがとう!

public void ProvideData(Guid providerKey, object data, string dataType)
{
    if (!data.GetType().IsSerializable)
    {
        throw new ArgumentException("The data passed is not serializable and therefore is not valid.", "data");
    }

    var formatter = new BinaryFormatter();
    using (var fileStream = new FileStream("data.dat", FileMode.Create))
    {
        formatter.Serialize(fileStream, data);
        fileStream.Close();
    }
}
于 2012-09-12T13:00:09.333 に答える