我有一个类,我需要能够序列化到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服务可以工作,但是当对象无法序列化为session时。如果我从类Bar中删除DataContract属性,则WCF服务无法说
类型 'BarProxy3bb05a31167f4ba492909ec941a54533' 与数据合同名称 'BarProxy3bb05a31167f4ba492909ec941a54533:http://schemas.datacontract.org/2004/07/' 不是预期的。不添加任何类型 静态地知道已知的名单 类型 - 例如,通过使用 KnownTypeAttribute属性或 将它们添加到已知类型列表中 传递给DataContractSerializer
我尝试将一个KnownType属性添加到foo类
[KnownType(typeof(Bar))]
但我仍然得到同样的错误。
任何人都可以帮我解决这个问题吗?
非常感谢
戴夫
答案 0 :(得分:8)
MSDN上的这个问题可能有所帮助:DataContract versus Serializable。
该线程接受的答案:
[DataContract]
和[Serializable]
可以一起使用。DataContractSerializer了解它们。如果类型用两者标记,则需要投影
[DataContract]
- 醇>
以下是WCF中有关数据传输和序列化的文档,其中提供了有关序列化程序和已知类型的大量详细信息:Data Transfer and Serialization
答案 1 :(得分:1)
我知道这已经很晚了,但是如果有人读到这个,我们就有类似的问题了。我们将DataContract保留为WCF序列化的解决方案,然后当我们序列化到SQL Server会话时,我们将对象序列化为JSON并将其写入会话。
答案 2 :(得分:0)
我遇到了与wcf中的实体框架pocos序列化相同的问题。没有什么工作,当我尝试从成员中删除虚拟标签时我就要放弃了。突然间它开始工作了。试一试。