如何从 WCF 中未使用 DataContractAttribute 或 SerializableAttribute 标记的类继承?

Posted

技术标签:

【中文标题】如何从 WCF 中未使用 DataContractAttribute 或 SerializableAttribute 标记的类继承?【英文标题】:How to inherit from a class which is not marked with DataContractAttribute or SerializableAttribute in WCF? 【发布时间】:2011-05-26 03:12:18 【问题描述】:

在 WCF 中,如何从没有标记 DataContractAttribute 或 SerializableAttribute 的类继承并将其用作数据契约?

例如:我有一个名为“EmailAttachment”的自定义类,我继承自 System.Net.Mail.Attachment:

[DataContract]
public class EmailAttachment : Attachment

   [DataMember]
   public string AttachmentURL
   
       set;
       get;
   
   [DataMember]
   public string DisplayName
   
       set;
       get;
   

但是当我发布服务时,它会抛出运行时错误:

System.Runtime.Serialization.InvalidDataContractException:类型“EmailAttachment”不能继承自未使用 DataContractAttribute 或 SerializableAttribute 标记的类型。

解决方法是什么?

【问题讨论】:

【参考方案1】:

这取决于您希望数据合同是什么样子。你不能使用包装器而不是派生类吗?比如:

[DataContract]
public class EmailAttachment

   public EmailAttachment()

   internal EmailAttachment(Attachment inner) _attachment = inner;

   [DataMember]
   public string AttachmentURL
   
       set;
       get;
   
   [DataMember]
   public string DisplayName
   
       set;
       get;
   

   private Attachment  _attachment;

如果您想在数据协定中公开来自内部 System.Mail.Attachment 的任何状态,则您需要添加 DataMember 属性以显示该状态。

【讨论】:

以上是关于如何从 WCF 中未使用 DataContractAttribute 或 SerializableAttribute 标记的类继承?的主要内容,如果未能解决你的问题,请参考以下文章

如何序列化/反序列化 C# WCF DataContract 到 XML

如何在 WCF 中使用 DataContract/DataMember 序列化 Func<int, int>(甚至是一般委托)类型字段

如何拥有一个带有 json 动态成员的 WCF DataContract

WCF:MessageContract、DataContract ... 感到困惑?

如何在数据合同 WCF 中使用枚举

在 WCF 中命名通用 DataContract