Платформа сущностей сериализует POCO в JSON - PullRequest
1 голос
/ 30 августа 2011

Я использую 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 ]

2 голосов
/ 30 августа 2011

Проблема в круговых ссылках.Простой способ избежать этого - использовать Json.Net http://james.newtonking.com/projects/json-net.aspx вместо стандартного сериализатора json MVC.Последняя версия Json.Net будет сериализовать объекты с круговыми ссылками из коробки.http://james.newtonking.com/projects/json/help/PreserveObjectReferences.html для получения дополнительной информации о проблеме

1 голос
/ 30 августа 2011

Стремитесь загрузить его, используя Include ().Пример linq:

var serializeMe = (from m in MyContext.Message.Include("User") where m.Id == someValue select m).ToList();

Это скажет EF загрузить свойство навигации пользователя сразу, а не ленивую загрузку, и тогда у сериализатора не должно быть проблем с ним.

0 голосов
/ 08 декабря 2013

Хорошо, давайте по частям.

¿Почему это происходит?

Поскольку у вас есть виртуальные свойства.Если вы используете EF, они вам действительно нужны, если вы используете Lazy loading.Вы можете настроить свой 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);

Я пытался сделать это как можно более универсальным.Я надеюсь, что это может помочь кому-то !!

С наилучшими пожеланиями и хорошего дня!:)

0 голосов
/ 30 августа 2011

Как насчет этого:

  • Отметьте свой класс как [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
{
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...