我当前的实现遍历特定项目中的所有类,使用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
方法我可以用来过滤它们。
任何帮助都将不胜感激。
答案 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();
}