如何将委托标记为不可序列化或忽略它?

时间:2013-11-25 12:02:36

标签: c# serialization reflection

我当前的实现遍历特定项目中的所有类,使用SerializableAttribute清除我标记为可序列化的所有类,并根据其他一些规则创建不同的XML模式文件并手动创建反序列化XML文件。一切都运行良好,直到我将第一个代表添加到我的项目中,如此:

public delegate void CharacterStoreChanged();

奇怪的是,编译器从代理生成的后备类会自动标记为可序列化,正如我在以下代码中所评论的那样:

    private static Type[] GetDatafileTypes()
    {
        Assembly assembly = Assembly.GetAssembly( typeof ( Importer ) );
        return
            assembly.GetTypes()
                .Where( t => t.IsSerializable && t.IsPublic )
                .ToArray(); //contains the delegate's backing class since it's public and automatically serializable
    }

    private static T Deserialize<T>( string filePath )
    {
        Type[] dataFileTypes = GetDatafileTypes();

        XmlSerializer x = new XmlSerializer( typeof ( T ), dataFileTypes ); //Fails because we provide a class in dataFileTypes that doesn't have an empty constructor :-(

        return (T)x.Deserialize( new XmlTextReader( filePath ) );
    }

我想忽略代表(以及未来可能出现的所有代表),但我不确定如何。我无法使用[NonSerializable][XmlIgnore]对其进行标记,因为这些不能应用于“声明类型”,并且IsDelegate上似乎没有TypeInfo方法我可以用来过滤它们。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:3)

您可以使用typeof(Delegate)检查IsAssignableFrom,看看该类型是否为委托。

private static Type[] GetDatafileTypes()
{
    Type delegateType = typeof(Delegate);
    Assembly assembly = Assembly.GetAssembly( typeof ( Importer ) );
    return
        assembly.GetTypes()
            .Where( t => t.IsSerializable && t.IsPublic && !delegateType.IsAssignableFrom(t))
            .ToArray();
}