2009-03-17 4 views
2

私はSessionキーをループして、エントリとその値をHashtableに追加しています。これをシリアル化しています。私が抱えている問題は、セッション上に直列化可能でないオブジェクトがあり、それはとにかく直列化してはいけないということです。私の周り探しています、そしてビルトインタイプの多くは、それが動作しないためにそうテスト、ISerializable属性を実装していない:クラスをシリアル化できるかどうかをどのようにして知ることができますか?

if (val is ISerializable) 
{ 
    ... 
} 

だから、私はこれをテストする方法を教えてください。これは理にかなっていますか?

答えて

10

オブジェクトがシリアル化可能かどうかを判断する方法は1つだけ保証されています。シリアライズし、操作が成功するかどうかを確認します。

私はそれがちょっと残酷すぎるように見えますが、シリアル化が壊れる可能性が非常に多くの異なる方法があります。メタデータには2つの項目があり、タイプが直列性を要求するかどうかを確認できます(ISerializableおよび[Serializable])が、これは単なるクレームです。それは非常に多くの異なる方法で壊れることがあります。

問題は、.Netの世界では、シリアライズする能力を宣言し、実際にシリアライズする行為は2つの別個の動作であるということです。それは完全に可能である(そして合法的である)一方を行うが、他方はしない。これを例にとると、

[Serializable] 
public class Foo { 
    public Object Field1; 
} 

このクラスはシリアル化可能であると主張しています。それはすべてField1に実際に格納されている値に依存します。型のメタデータ検査の量は、実際にシリアル化できるかどうかは皆に教えられません。あなたができることは、それが成功するかどうか試してみることです。

+0

それを直列化することは、過剰な殺人のように思えます。いくつかの人は、クローンの目的でシリアライゼーションを使用しています:-) ...とにかく、成功したシリアライゼーションは、次回の成功を保証しません。 –

+0

@トーロ、そうではありません。シリアライズのポイントにあるオブジェクトがシリアライズ可能かどうかだけを伝えます。私はあなたが試みる他の方法が働くことが保証されていないので、それは残酷だとは思わない。 – JaredPar

+0

私は[Serializable]を使い、失敗した場合に例外を処理します。とにかくそれをやる必要があります。少なくともシリアライズ可能であるとフラグされていない場合は、試してみる必要はありません。 –

-1

CRLと同じものを確認してください:[Serializable]属性。

+0

動作しません。その属性を持つことはできますが、まだシリアル化されていない場合は失敗します – JaredPar

+0

確かに、成功したシリアル化は次回の成功を保証しません。 –

0

TypeクラスのIsSerializableプロパティを使用できます。

if(val.GetType().IsSerializable) 
+0

動作しません。私はシリアライズ可能であると主張できますが、シリアライズでは失敗します。 – JaredPar

+0

そしてそれは明らかに[Serializable]のみをチェックしています:ISerializable –

関連する問題