C# 如何判断类是否可以序列化?

C# 如何判断类是否可以序列化?,c#,serialization,C#,Serialization,我循环遍历会话键,并将条目及其值添加到哈希表中,然后将其序列化。我遇到的问题是会话中有一个对象是不可序列化的,而且无论如何都不应该序列化。我环顾四周,发现很多内置类型都没有实现ISerializable属性,因此测试该属性不起作用: if (val is ISerializable) { ... } 那么,我如何对此进行测试?这有意义吗?检查CRL将使用的相同东西:[Serializable]属性。确定对象是否可序列化的方法只有一种。序列化它并查看操作是否成功 我知道这似乎有点过分,但

我循环遍历会话键,并将条目及其值添加到哈希表中,然后将其序列化。我遇到的问题是会话中有一个对象是不可序列化的,而且无论如何都不应该序列化。我环顾四周,发现很多内置类型都没有实现ISerializable属性,因此测试该属性不起作用:

if (val is ISerializable)
{
    ...
}

那么,我如何对此进行测试?这有意义吗?

检查CRL将使用的相同东西:
[Serializable]
属性。

确定对象是否可序列化的方法只有一种。序列化它并查看操作是否成功

我知道这似乎有点过分,但有太多不同的方法可以打破序列化。元数据中有两项可以检查,以查看类型是否声明可序列化(ISerializable和[Serializable]),但这只是一个声明。它可以,也可以以许多不同的方式被破坏

问题是在.Net世界中,声明序列化能力和实际序列化是两个不同的操作。这是完全可能的(也是合法的)做一件事,但不做另一件事。以此为例,

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

这个类声称是可序列化的,很可能是可序列化的。这完全取决于字段1中实际存储的值。对类型进行大量的元数据检查都不会告诉您它是否可以被序列化。您所能做的就是尝试看看是否成功。

您可以使用Type类的IsSerializable属性

if(val.GetType().IsSerializable)

不起作用。您可以拥有该属性,但仍然无法序列化。成功的序列化不能保证下次成功。不起作用。我可以声称是可序列化的,但序列化失败。序列化听起来有点过分了。有些人将序列化用于克隆目的:-)。。。无论如何,成功的序列化不能保证下次成功。@Toro,不,不能保证。它只告诉您序列化点处的对象是否可序列化。但我不认为这有什么过激之处,因为没有其他方法可以保证有效。我会使用[Serializable],然后在异常失败时处理异常。不管怎样,你几乎必须这么做。至少如果它没有被标记为可序列化,您可以避免尝试。