1

ISerializable を実装する場合、このようなコードを記述して、カスタムの逆シリアル化を実行します...

(注: これは些細な例であり、カスタムの逆シリアル化を保証するものではありません)。

protected ClientInformation(SerializationInfo info, StreamingContext context)
{
    _culture = (string)info.GetValue("Culture", typeof(string))
}

インテリセンスのヘルプによれば、逆シリアル化する型を GetValue メソッドに渡す必要があります。

「格納された値をこの型に変換できない場合、システムは System.InvalidCast 例外をスローします」

これは、私のステートメント例で 2 つのキャストが実行されているということですか?

さらに、この型パラメーターを追加するポイントは何ですか。次のように書くと

_culture = info.GetValue("Culture", typeof(string))

...「型「オブジェクト」を「文字列」に暗黙的に変換できない」ため、これはとにかくコンパイルされません。したがって、これはとにかくオブジェクトをキャストする必要があることを意味します。したがって、キャストが無効な場合、いずれにしても自分のキャストを介して InvalidCastException を取得します。

ここでは2 つのキャストが発生しているように見えますが、同様に、エラーは実行時にのみ発生する可能性があります (ジェネリックを介して達成できるコンパイル型チェックはありません)。

更新:「is」演算子を使用して型が期待どおりであることを確認する舞台裏である可能性がありますか? 「is」は自動的にキャストを試みますか?

4

1 に答える 1

0

GetValue の実装を見ると、オブジェクト自体はキャストされていないように見えますが、少なくとも 1 つのキャスト (Type から RuntimeType) が発生しています。

そして、私が知る限り、オブジェクトがキャストされているかどうかを判断するいくつかのチェックが重要ではありません。

public object GetValue(string name, Type type)
{
    Type type3;
    if (type == null)
    {
        throw new ArgumentNullException("type");
    }
    RuntimeType castType = type as RuntimeType;
    if (castType == null)
    {
        throw new ArgumentException(Environment.GetResourceString("Argument_MustBeRuntimeType"));
    }
    object element = this.GetElement(name, out type3);
    if (RemotingServices.IsTransparentProxy(element))
    {
        if (RemotingServices.ProxyCheckCast(RemotingServices.GetRealProxy(element), castType))
        {
            return element;
        }
    }
    else if ((object.ReferenceEquals(type3, type) || type.IsAssignableFrom(type3)) || (element == null))
    {
        return element;
    }
    return this.m_converter.Convert(element, type);
}
于 2011-11-29T15:14:06.633 に答える