2016-10-18 15 views
0

これまでのところTに属性[Serializable]がある場合、typeof(T).IsSerializableが真とみなされています。 (そして、混乱している名前ISerializableとは無関係です)。
最初の仮定は間違っています。 IsSerializableはもっと複雑で、私はそれが何のために使われるべきかを理解していません。 IsSerializableは本当ですが、型が直列化可能ではありませんなぜ列挙可能なのは<T> Tのためにシリアライズ可能ではないですか?

例:

using NUnit.Framework; 

[TestFixture] 
internal class Tests { 

    private class MyClass {} 

    [Test] 
    public void TestIsNotSerialisable() 
    { 
     // Passes 
     Assert.That(typeof(MyClass).IsSerializable, Is.False); 
    } 

    [Test] 
    public void TestIsNotSerialisableArray() 
    { 
     // Fails (is Serializable) 
     Assert.That(typeof(MyClass[]).IsSerializable, Is.False); 
    } 

    [Test] 
    public void TestIsNotSerialisableList() 
    { 
     // Fails (is Serializable) 
     Assert.That(typeof(List<MyClass>).IsSerializable, Is.False); 
    } 
} 

MSDN for IsSerializable

がそうでない場合でも、T[]はなぜシリアル化可能ですか?

+0

は '一覧' 'T 'が直列化可能である場合、シリアライズと考えられるが、T'のプロパティのタイプ'の一つではありませんでしょうか?あなたはこの質問に対する答えをどうしますか?どのような問題を解決しようとしていますか? – CodeCaster

答えて

1

共有MSDNのリンクは備考セクションでこれを説明する:

現在のTypeが構築ジェネリック型を表している場合、このプロパティは型が構築されたジェネリック型定義に適用されます。たとえば、現在のTypeがMyGenericType(Visual BasicではMyGenericType(Of Integer))を表す場合、このプロパティの値はMyGenericTypeによって決まります。だから、List<T>

はあなたが直列化可能でないことから、ジェネリック型を構築することが可能にもかかわらず、直列化可能とみなされ、そしてIsSerializableプロパティはそれを反映していません。

+0

良い点ですが、これは 'MyClass []'にどうやって当てはまりますか? – RJFalconer

+1

良い点:)その質問に対する答えは似ています。配列はジェネリック型ではなく、ジェネリック型のように動作し、配列の「ベース実装」はシリアライズ可能です。しかし、私はこれらの文書を見つけることはできません。 –

1

IsSerializableが真であり、実際に実行時の問題なしにオブジェクトをシリアル化できるかどうかは異なります。 Listは直列化可能であるため、IsSerializableフラグは常に設定されます。しかし、UnderlyingSystemTypeを調べると、MyClassが直列化できないことがわかります。

public void TestIsNotSerialisableList() 
{ 
    Assert.That(typeof(List<MyClass>).UnderlyingSystemType.IsSerializable, Is.False); 
} 
関連する問題