Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用序列化属性标识类型?_C#_Serialization - Fatal编程技术网

C# 如何使用序列化属性标识类型?

C# 如何使用序列化属性标识类型?,c#,serialization,C#,Serialization,我需要定义一个方法参数,理想情况下,该参数应该只接受用Serializable属性修饰过的对象参数。方法任务是将对象参数持久化到XML文档中 我知道我最终可以检查SerializationException,但我更希望能够将其作为方法契约的一部分来定义。那么,有什么方法可以隔离使用此属性修饰的类型吗?一个选项是使用类型的IsSerializable属性: public void Serialize(object obj) { if (obj.GetType().IsSerializabl

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


我知道我最终可以检查
SerializationException
,但我更希望能够将其作为方法契约的一部分来定义。那么,有什么方法可以隔离使用此属性修饰的类型吗?

一个选项是使用
类型的
IsSerializable
属性:

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

您可以对对象的类型使用
GetCustomAttributes
函数

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

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

编辑我想您是想让编译器强制执行参数have the attribute。没有办法做到这一点。您必须使用如上所述的运行时检查并抛出异常


泛型通常是这类任务的朋友,在这种情况下,您可以在类型实现ISerializable的地方使用泛型参数,但正如您所知,这将排除声明序列化而不是实现序列化的情况。

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

public void Serialize<T>(T obj) where T : ISerializable
{
    // Do work
}
public void序列化(T obj),其中T:ISerializable
{
//工作
}

不幸的是,这并不算是对您问题的回答,因为不是每个
Serializable
类都实现了
ISerializable

可序列化的修饰对象不会自动实现ISerializable。此外,我不怀疑我在函数体中检查类型有效性的能力。我想知道的是,我是否可以与调用者签订协议,其中只有具有serializable属性的对象才能作为参数传递。
IsSerializable
属性对于使用
[serializable]
修饰的类返回true,但是对于那些实现了
ISerializable
的类来说,这是不可能的。我认为唯一的方法就是让你的类实现
ISerializable
,正如@Frank Boyne.Yes建议的那样。我可能还有其他的方法。但这不是我问的。很高兴知道我能做到。我可以看到很多其他有趣的应用程序。谢谢。这个问题是由aligray(和Reddog)回答的,但我似乎不能回去接受答案,因为我在匿名模式下不知不觉地问了这个问题。对此我深表歉意。