实体框架将POCO序列化为JSON

时间:2011-08-29 20:35:08

标签: json entity-framework serialization entity-framework-4.1

我正在使用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; }
}

4 个答案:

答案 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]
  • 使用JsonSerializer将对象序列化为JSON。
  • 也许在EF查询的属性上使用急切加载?
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);

我尽力让它尽可能通用。我希望这可以帮助别人!!

祝您好运,祝您度过愉快的一天! :)