为什么不能在同一个类上同时使用WCF DataContract和ISerializable?

11

我有一个类需要序列化到 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的已知类型列表中

我尝试将KnownType属性添加到foo类中

[KnownType(typeof(Bar))]

但我仍然收到相同的错误提示。

有谁能帮助我解决这个问题吗?

非常感谢。

Dave


密切相关:https://dev59.com/zlTTa4cB1Zd3GeqPtpWh - David
3个回答

7
这篇MSDN上的问题可能会有所帮助:DataContract versus Serializable
那个线程中被接受的答案:
1. `[DataContract]` 和 `[Serializable]` 可以一起使用。 2. DataContractSerializer 理解它们两个。如果该类型标记了这两个标记,它将采用 `[DataContract]` 的投影。 3. 这里是关于 WCF 中数据传输和序列化的文档,提供了大量关于序列化器和已知类型的详细信息:Data Transfer and Serialization

最后,我所做的是复制我的类并通过服务返回它们。谢谢。 - Dave
2
最好提供实际答案,而不是链接,因为论坛目前正在维护中... - Max Schilling
3
@MaxSchilling说的对——只放链接而没有摘要是不好的做法(我发帖后已经学到了)。论坛恢复后,我会进行修正。 - Anders Abel
3
这个答案是错误的或者措辞不当。[DataContract]和[Serializable]不能同时使用。你可以在DataContractSerializer中使用其中一个,但是同时应用这两个属性将不起作用。 - Jf Beaulac

2

我知道现在已经很晚了,但如果有人看到这篇文章,我们曾遇到过类似的问题。我们的解决方案是保留DataContract不变,以便WCF序列化正常工作,然后当我们将对象序列化到SQL Server会话时,我们将对象序列化为JSON并将其写入会话。


0

我在使用WCF跨越实体框架POCO进行序列化时遇到了同样的问题。一切都不起作用,当我尝试从成员中删除虚拟标签时,我差点放弃了。突然间它开始工作了。你也可以试试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接