Nao*_*aor 4 .net c# serialization entity-framework web-services
我有一个Reason对象:
public class Reason
{
public virtual long Id { get; set; }
public virtual string Name { get; set; }
public virtual Company Company {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
我使用实体框架4,公司是公司的导航属性.
我还使用webservices将数据返回给客户端.
我有web方法返回原因:
[WebMethod]
public Reason[] GetCallReasons()
{
IReasonRepository rep =
ObjectFactory.GetInstance<IReasonRepository>();
return rep.GetReasonsList().ToArray();
}
Run Code Online (Sandbox Code Playgroud)
由于ef4,我在执行web方法时遇到以下异常:
A circular reference was detected while serializing an object of type 'System.Data.Entity.DynamicProxies.Reason_24A0E4BBE02EE6BC2CF30BB56CFCB670C7D9D96D03D40AF4D174B89C9D3C5537'
Run Code Online (Sandbox Code Playgroud)
问题是因为ef4添加了无法序列化的属性:

为了解决这个问题并消除错误,我可以通过不使虚拟或删除导航属性来禁用导航属性.但我知道它并想要使用延迟加载功能.
我也可以为Reason编写特定的序列化器,但是我在我的web服务中使用了许多类,并为所有这些编写序列化器是很多工作.
我怎样才能解决这个异常?
Lad*_*nka 11
您的问题有多种解决方案,它们实际上取决于您使用的服务类型和序列化类型:
所有其他方法都基于tweeking序列化,如@Haz建议:
DataContractSerializer:DataContract[IsReference=true]使用[DataMember]属性明确标记您的实体和所有属性.这将允许您使用循环引用.如果您使用T4模板生成实体,则必须对其进行修改以为您添加这些属性.DataContractSerializer:隐式序列化.使用[IgnoreDataMember]属性标记其中一个相关的导航属性,以便不对该属性进行序列化.XmlSerializer:使用[XmlIgnore]属性标记一个相关的导航属性[NonSerialized]为常见序列化或[ScriptIgnore]某些与JSON相关的序列化标记相关导航属性之一(Haz为第一个提及此内容的+1).我经常为webservice编写特定的类.虽然这是一些额外的工作,但它具有以下优势:web服务变得更加健壮,因为实体中的小变化不会消失,并且在消费者/ javascript方面无声地失败.例如,如果我更改属性的名称.
您可以做一些事情来减少工作,一个是使用可以自动在对象之间映射的AutoMapper.
| 归档时间: |
|
| 查看次数: |
5355 次 |
| 最近记录: |