为啥我不能在同一个类上使用 WCF DataContract 和 ISerializable?

Posted

技术标签:

【中文标题】为啥我不能在同一个类上使用 WCF DataContract 和 ISerializable?【英文标题】:Why can't I use WCF DataContract and ISerializable on the same class?为什么我不能在同一个类上使用 WCF DataContract 和 ISerializable? 【发布时间】:2011-01-28 12:31:24 【问题描述】:

我有一个类,我需要能够序列化为 SQLServer 会话变量并通过 WCF 服务可用。我已经声明如下

namespace MyNM

[Serializable] 
[DataContract(Name = "Foo", Namespace = "http://www.mydomain.co.uk")]

public class Foo : IEntity, ISafeCopy<Foo>

    [DataMember(Order = 0)] 
    public virtual Guid Id  get; set; 

    [DataMember(Order = 1)] 
    public virtual string a  get; set; 

    DataMember(Order = 2)]
    public virtual Bar c  get; set; 

    /* ISafeCopy implementation */



[Serializable]
[DataContract(Name = "Bar ", Namespace = "http://www.mydomain.co.uk")]
public class Bar : IEntity, ISafeCopy<Bar>

    #region Implementation of IEntity

    DataMember(Order = 0)]
    public virtual Guid Id  get; set; 
    [DataMember(Order = 1)]
    public virtual Baz y  get; set; 

    #endregion

    /* ISafeCopy implementation*/



[Serializable]
[DataContract]
public enum Baz

    [EnumMember(Value = "one")]
    one,
    [EnumMember(Value = "two")]
    two,
    [EnumMember(Value = "three")]
    three

但是当我尝试调用此服务时,我在跟踪日志中收到以下错误。

"System.Runtime.Serialization.InvalidDataContractException: 类型 'BarProxybcb100e8617f40ceaa832fe4bb94533c' 不能是 ISerializable 并且有 DataContractAttribute 属性。”

如果我取出 Serializable 属性,WCF 服务可以工作,但是当对象无法序列化到会话时。如果我从类 Bar 中删除 DataContract 属性,WCF 服务会失败说

类型 'BarProxy3bb05a31167f4ba492909ec941a54533' 带有数据合同名称 'BarProxy3bb05a31167f4ba492909ec941a54533:http://schemas.datacontract.org/2004/07/' 预计不会。添加任何类型不 静态已知到已知列表 类型 - 例如,通过使用 KnownTypeAttribute 属性或由 将它们添加到已知类型列表中 传递给 DataContractSerializer

我尝试向 foo 类添加 KnownType 属性

[KnownType(typeof(Bar))]

但我仍然遇到同样的错误。

谁能帮我解决这个问题?

非常感谢

戴夫

【问题讨论】:

密切相关:***.com/q/5086378/1467396 【参考方案1】:

MSDN 上的这个问题可能会有所帮助:DataContract versus Serializable。

该线程接受的答案:

    [DataContract][Serializable] 可以一起使用。

    DataContractSerializer 理解它们。如果 type 都标有这两个,则取投影 [DataContract]

    以下是有关 WCF 中数据传输和序列化的文档,其中提供了有关序列化程序和已知类型的大量详细信息:Data Transfer and Serialization

【讨论】:

谢谢 - 最后,我所做的是复制我的课程并通过服务返回。 如果能在这里得到实际的答案,而不是链接,因为论坛目前正在停机维护...... @MaxSchilling:你是对的——只有一个没有摘要的链接是不好的做法(自从我发布那个答案后我就学会了)。论坛上线后,我会修复它。 这个答案是错误的,或者措辞不当。 [DataContract] 和 [Serializable] 不能一起使用。您可以将其中任何一个与 DataContractSerializer 一起使用,但应用这两个属性将不起作用。【参考方案2】:

我知道这已经很晚了,但如果有人读到这个,我们就会遇到类似的问题。我们将 DataContract 保留为 WCF 序列化良好的解决方案,然后当我们序列化到 SQL Server 会话时,我们将对象序列化为 JSON 并将其写入会话。

【讨论】:

【参考方案3】:

我在跨 wcf 的实体框架 pocos 的序列化中遇到了同样的问题。没有任何效果,当我尝试从成员中删除虚拟标签时,我正要放弃。突然间它开始工作了。试试看吧。

【讨论】:

以上是关于为啥我不能在同一个类上使用 WCF DataContract 和 ISerializable?的主要内容,如果未能解决你的问题,请参考以下文章

为啥,当我在 WCF 服务中模拟时,当我尝试运行 LINQ to SQL 查询时,我的服务不能加载 System.Transactions?

为啥 Eclipse 的表达式视图在某些类上失败?

为啥我必须使用 WCF 而不是 Web 服务? [复制]

为啥在 Worker 角色中托管 WCF 服务

为啥 WCF 休息服务(不是使用 WCF 休息服务模板创建的)不起作用?

为啥无法在类上找到适当的构造函数