到目前为止,如果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);
}
}
那么即使T[]
不是T
,为什么Photo class (models.Model):
name = models.CharField (max_length = 150)
url = models.URLField ()
__unicode def __ (self): # 0 parameters
return self.name
可序列化?
答案 0 :(得分:1)
您分享的MSDN链接在备注部分中说明了这一点:
如果当前Type表示构造的泛型类型,则此属性适用于构造类型的泛型类型定义。例如,如果当前Type表示MyGenericType(Visual Basic中的MyGenericType(Of Integer)),则此属性的值由MyGenericType确定。
所以List<T>
被认为是可序列化的,即使你可以从中构造不可序列化的泛型类型,而IsSerializable
属性也不能反映出来。
答案 1 :(得分:1)
IsSerializable之间存在差异,实际上能够在没有运行时问题的情况下序列化对象。由于List是可序列化的,因此始终设置IsSerializable标志。但是,如果查看UnderlyingSystemType,您将看到MyClass不可序列化。
public void TestIsNotSerialisableList()
{
Assert.That(typeof(List<MyClass>).UnderlyingSystemType.IsSerializable, Is.False);
}