【问题标题】:How do I tell if a class can be serialized?如何判断一个类是否可以序列化?
【发布时间】:2009-03-17 18:21:19
【问题描述】:

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

if (val is ISerializable)
{
    ...
}

那么,我该如何测试呢?这有意义吗?

【问题讨论】:

    标签: c# serialization


    【解决方案1】:

    只有一种保证方法可以确定对象是否可序列化。序列化它,看看操作是否成功。

    我知道这似乎有点矫枉过正,但有很多不同的方法可以破坏序列化。元数据中有两个项目,您可以检查一个类型是否声明可序列化(ISerializable 和 [Serializable]),但这只是一个声明。它可以并且以多种不同的方式被破坏。

    问题在于,在 .Net 世界中,声明能够被序列化和实际序列化的行为是两个独立的不同行为。完全有可能(并且合法)做一个但不能做另一个。以这个为例

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

    这个类声称是可序列化的,而且很可能是可序列化的。这完全取决于实际存储在 Field1 中的值。再多的对类型的元数据检查都不会告诉你它是否真的可以被序列化。你所能做的就是尝试看看它是否成功。

    【讨论】:

    • 对其进行序列化听起来有点矫枉过正。有些人将序列化用于克隆目的:-) ...无论如何,成功的序列化并不能保证下次成功。
    • @Toro,不,它没有。它只告诉您序列化点的对象是否可序列化。不过,我认为这并不过分,因为您尝试的其他方法都不能保证有效。
    • 我会使用 [Serializable] ,如果失败则处理异常。无论如何,您几乎都必须这样做。至少如果它没有被标记为可序列化,你可以避免尝试。
    【解决方案2】:

    您可以使用 Type 类的 IsSerializable 属性。

    if(val.GetType().IsSerializable)
    

    【讨论】:

    • 不起作用。我可以声称是可序列化的,但序列化失败。
    【解决方案3】:

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

    【讨论】:

    • 不起作用。您可以拥有该属性,但仍然无法被序列化
    • 可以,序列化成功并不保证下次会成功。
    猜你喜欢
    • 1970-01-01
    • 2020-01-23
    • 2011-05-09
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多