如何使用序列化属性识别类型?

时间:2011-06-16 23:09:14

标签: c# serialization

我需要定义一个方法参数,理想情况下应该只接受用Serializable属性修饰的对象参数。方法任务是将object参数持久化为XML文档。

我知道我最终可以检查SerializationException,但我宁愿能够巧妙地将其定义为方法合同的一部分。那么,有什么方法可以隔离用这个属性修饰的类型吗?

3 个答案:

答案 0 :(得分:5)

一种选择是使用IsSerializable类的Type属性:

public void Serialize(object obj)
{
    if (obj.GetType().IsSerializable)
    {
        // do work
    }
}

答案 1 :(得分:2)

您可以在对象类型上使用GetCustomAttributes函数。

    public void Serialize(object itemToSerialize)
    {
        var hasAttribute = itemToSerialize.GetType().GetCustomAttributes(typeof(SerializableAttribute), true).Any();

        // Do stuff.
    }

但是,不要忘记正常的序列化也支持ISerializable。因此,类型上的IsSerializable属性可能更合适。

编辑我认为您正在以一种方式让编译器强制执行参数具有该属性。没有办法做到这一点。您必须使用上面的运行时检查并抛出异常。

泛型通常是这类任务的朋友,在这种情况下,您可以使用类型实现ISerializable的泛型参数,但是您知道这将排除声明序列化的情况比实施。

答案 2 :(得分:0)

如果您可以进一步限制事物,以便只允许实现ISerializable的对象,那么您可以使用泛型来进行编译时检查

public void Serialize<T>(T obj) where T : ISerializable
{
    // Do work
}

不幸的是,这并不算作您问题的答案,因为并非每个Serializable类都会实现ISerializable