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: http://schemas.datacontract.org/2004/07/ ”的“BarProxy3bb05a31167f4ba492909ec941a54533”是不应该的。将任何静态未知的类型添加到已知类型列表中 - 例如,通过使用 KnownTypeAttribute 属性或将它们添加到传递给 DataContractSerializer 的已知类型列表中

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

[KnownType(typeof(Bar))]

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

谁能帮我解决这个问题?

非常感谢

戴夫

4

3 回答 3

7

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

该线程接受的答案:

  1. [DataContract]并且[Serializable]可以一起使用。

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

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

于 2010-03-17T10:38:05.483 回答
2

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

于 2013-04-23T15:02:49.333 回答
0

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

于 2011-11-27T04:32:59.430 回答