我正在使用Ef 4.1并且我有一个POCO对象我想序列化为JSON,我已经读过在使用延迟加载时有一个问题,但是我不确定我能不能Message
可以拥有Message
的集合。
有没有办法做到这一点?将这种对象转换为JSON?
我的Message
对象如下:
public class Message
{
[Key]
public int Id { get; set; }
public int? ParentId { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public DateTime CreatedAt { get; set; }
public DateTime? LastModified { get; set; }
public virtual User User { get; set; }
public virtual Message Parent { get; set; }
public virtual ICollection<Message> Children { get; set; }
}
答案 0 :(得分:2)
问题是循环引用。避免这种情况的一种简单方法是使用Json.Net http://james.newtonking.com/projects/json-net.aspx而不是默认的MVC json序列化程序。最新版本的Json.Net将使用开箱即用的循环引用序列化对象。 http://james.newtonking.com/projects/json/help/PreserveObjectReferences.html了解有关问题的更多信息
答案 1 :(得分:1)
使用Include()急切加载它。示例linq:
var serializeMe = (from m in MyContext.Message.Include("User") where m.Id == someValue select m).ToList();
这将告诉EF立即加载User导航属性而不是延迟加载它,然后串行器应该没有问题。
答案 2 :(得分:0)
这个怎么样:
[Serializable]
Message msg = new Message();
var serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(msg.GetType());
MemoryStream ms = new MemoryStream();
serializer.WriteObject(ms, msg);
string json = Encoding.Default.GetString(ms.ToArray());
[Serializable]
public class Message
{
}
答案 3 :(得分:0)
好吧,让我们按部分去。
¿为什么会发生这种情况?
因为您有虚拟属性。如果您使用的是EF,则在使用延迟加载时实际需要它们。您可以通过此示例将EF配置为不执行此操作:
context.Configuration.ProxyCreationEnabled = false;
其中context是您的ObjectContext或DbContext ...这假设您正在使用EF。但对于大多数情况来说,这不是一个好的方法。
可能的解决方案
正如我经常说的那样:“没有好的或坏的解决方案,只有不同的方式,这取决于上下文”,说,你可以创建动态对象。
如果您只需要序列化一个唯一对象,您可以执行类似这样的操作
Json(new {@property1=yourObject.property1, @property2=yourObject.property2})
如果你有一个清单,那么你可以这样做:
var list = new List<dynamic>();
foreach(var item in myRepository.GetAll())
{
list.Add(new
{
@property1= item.property1,
@property2= item.property2,
@property3= item.property3
});
}
return Json(list, JsonRequestBehavior.DenyGet);
我尽力让它尽可能通用。我希望这可以帮助别人!!
祝您好运,祝您度过愉快的一天! :)