gpt4 book ai didi

c# - 如何从 XML 序列化程序集中排除一个类

转载 作者:太空宇宙 更新时间:2023-11-03 12:40:31 27 4
gpt4 key购买 nike

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

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

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

编译器失败并报错,提示 ExportAttribute.ContractName 缺少公共(public)属性 setter :

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

其实我不想序列化这个类,所以我想把它排除在序列化程序集之外。我可以这样做吗?或者,指定要包含哪些类?

到目前为止我已经尝试/想到的:

  • 在 MyExportAttribute 中用一个空的 setter 隐藏 ContractName 属性(非虚拟),在 getter 中调用基实现 -> 同样的错误,序列化器仍然想访问基类上的属性
  • 对 MyExportAttribute.ContractName 应用 XmlIgnore 也没有帮助
  • 将类(class)转移到其他项目是一种选择,但我想尽可能避免这种情况
  • ContractName 属性上的 XmlIgnore 可以解决我的问题,但我当然不能将它添加到 ExportAttribute。是否有类似的 XML 序列化控制属性可以应用于类,以便序列化程序忽略它?

最佳答案

为了解决这个错误,我实现了 IXmlSerializable在给出 sgen 问题的类上。我通过抛出 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");
}

关于c# - 如何从 XML 序列化程序集中排除一个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39143327/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com