C# - 为什么T的可枚举<t>可序列化,不可序列化?

时间:2016-10-18 14:48:32

标签: c# serialization

到目前为止,如果typeof(T).IsSerializable具有属性T,我一直在考虑[Serializable]为真。 (与令人困惑的ISerializable)无关。
第一个假设是错误的; IsSerializable似乎更复杂,我不明白它的用途是什么。

IsSerializable为真但类型不可序列化的示例:

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[]不是T,为什么Photo class (models.Model):      name = models.CharField (max_length = 150)      url = models.URLField ()      __unicode def __ (self): # 0 parameters          return self.name 可序列化?

2 个答案:

答案 0 :(得分:1)

您分享的MSDN链接在备注部分中说明了这一点:

  

如果当前Type表示构造的泛型类型,则此属性适用于构造类型的泛型类型定义。例如,如果当前Type表示MyGenericType(Visual Basic中的MyGenericType(Of Integer)),则此属性的值由MyGenericType确定。

所以List<T>被认为是可序列化的,即使你可以从中构造不可序列化的泛型类型,而IsSerializable属性也不能反映出来。

答案 1 :(得分:1)

IsSerializable之间存在差异,实际上能够在没有运行时问题的情况下序列化对象。由于List是可序列化的,因此始终设置IsSerializable标志。但是,如果查看UnderlyingSystemType,您将看到My​​Class不可序列化。

public void TestIsNotSerialisableList()
{
    Assert.That(typeof(List<MyClass>).UnderlyingSystemType.IsSerializable, Is.False);
}