如何从XML序列化程序集中排除类

时间:2016-08-25 10:52:07

标签: c# xml-serialization

我有一个C#项目,我必须激活XML序列化程序集生成(csproj中的GenerateSerializationAssemblies)。

该项目包含一个派生自System.ComponentModel.Composition.ExportAttribute的类。

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = false)]
public class MyExportAttribute : ExportAttribute
{ ... }

编译器失败,错误地抱怨ExportAttribute.ContractName上缺少公共属性设置器:

Error 10 Cannot deserialize type 'System.ComponentModel.Composition.ExportAttribute' because it contains property 'ContractName' which has no public setter. 

实际上我不想序列化这个类,所以我想将它从序列化程序集中排除。我能这样做吗?或者,指定要包含哪些类?

到目前为止我尝试/想过的事情:

  • 使用空的setter隐藏MyExportAttribute中的ContractName属性(非虚拟),在getter中调用基本实现 - >同样的错误,序列化程序仍然想要访问基类上的属性
  • 将XmlIgnore应用于MyExportAttribute.ContractName也无济于事
  • 将课程移到其他项目是一种选择,但我希望尽可能避免这样做
  • ContractName属性上的XmlIgnore将解决我的问题,但当然我无法将其添加到ExportAttribute。是否有类似的XML序列化控制属性可以应用于类,以便序列化程序忽略它?

1 个答案:

答案 0 :(得分:1)

要解决此错误,我在产生sgen问题的类上实现了IXmlSerializable。我通过抛出NotImplementedException实现了每个必需的成员:

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = false)]
public class MyExportAttribute
    : ExportAttribute
    // Necessary to prevent sgen.exe from exploding since we are
    // a public type with a parameterless constructor.
    , System.Xml.Serialization.IXmlSerializable
{
    System.Xml.Schema.XmlSchema System.Xml.Serialization.IXmlSerializable.GetSchema() => throw new NotImplementedException("Not serializable");
    void System.Xml.Serialization.IXmlSerializable.ReadXml(System.Xml.XmlReader reader) => throw new NotImplementedException("Not serializable");
    void System.Xml.Serialization.IXmlSerializable.WriteXml(System.Xml.XmlWriter writer) => throw new NotImplementedException("Not serializable");
}