我循环遍历Session键并将条目及其值添加到Hashtable,然后我将其序列化。我遇到的问题是Session上有一个不可序列化的对象,它不应该被序列化。我正在环顾四周,而且很多内置类型都没有实现ISerializable属性,所以测试它不起作用:
if (val is ISerializable)
{
...
}
那么,我该如何测试呢?这有意义吗?
答案 0 :(得分:10)
确定对象是否可序列化只有一种保证方法。序列化它,看看操作是否成功。
我知道这似乎有点矫枉过正,但是有很多不同的方法可以打破序列化。您可以检查元数据中的两个项目,以查看类型是否声明可序列化(ISerializable和[Serializable]),但这只是一个声明。它可以并且以多种不同的方式被打破。
问题在于,在.Net世界中,声明序列化和实际序列化能力的行为是两个独立的不同行为。完全可能(和合法)做一个而不是另一个。以此为例
[Serializable]
public class Foo {
public Object Field1;
}
这个类声称是可序列化的,可能很好。这一切都取决于Field1中实际存储的值。对类型的任何数量的元数据检查都不会告诉您它是否可以实际序列化。你所能做的只是试着看它是否成功。
答案 1 :(得分:0)
您可以使用Type类的IsSerializable属性。
if(val.GetType().IsSerializable)
答案 2 :(得分:-1)
检查CRL将使用的相同内容:[Serializable]
属性。