2012-02-13 5 views
4

У меня есть несколько классов BusinessObject, которые ссылаются друг на друга, и мне нужно сериализовать их в JsonResponse и вернуть их в мое представление. Я продолжаю получать исключение для круговой ссылки, и я не могу избавиться от него. Я поместил декоратор [ScriptIgnore()] на каждое свойство, которое не является простым свойством типа данных, и я все еще получаю исключение. Я не могу понять, где проблема, поскольку я блокирую сериализатор от всего примерно, и он все еще взрывается.Циркулярные ссылки и проблемы ScriptIgnore

Есть ли способ увидеть, что они представляют собой состояние сериализованного объекта?

[HttpPost] 
    public JsonResult GetAnalysisInfo(int id) 
    { 
     ProjectContext myDB = db; 
     SearchAnalysis searchanalysis = SearchAnalysis.Find(myDB, id); 
     //searchanalysis.Results = searchanalysis.SearchResultsPrototype(myDB); 
     return this.Json(searchanalysis); 
    } 

Update

Я также попытался реализации ISerializable безрезультатно. Моя GetObjectData очень проста:

public void GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
     info.AddValue("SearchAnalysisId", this.SearchAnalysisId); 
     info.AddValue("Created", this.Created); 
    } 

По-прежнему возникает ошибка CircularRefernce. Типы данных DateTime не создают проблем с сериализацией?

+0

Мои классы - сущности Entity Framework. Он имеет только пару простых сохраняемых свойств, кучу немаркированных свойств и довольно много статических методов и экземпляров. Определение класса слишком длинное, чтобы публиковать здесь. Объект Json фактически находится в обратной линии действия контроллера, и я разместил его выше. – CodeWarrior

+0

Интересно, что после попытки внедрения ISerializable (и неудачи) я добавил декоратор атрибутов [Serializable]. Теперь все работает нормально (хотя свойства, которые я специально сериализую, не те, которые попадают в сериализованный объект ... Если я удалю ISerializable, это не сработает. Если я удалю [Serializable], это не сработает. – CodeWarrior

+0

Вы когда-нибудь фигурировали почему «ScriptIgnore' не работал? У меня такая же проблема с моими подразделениями, которые разделены на отдельную библиотеку классов и пытаются сериализовать сущность из моего контроллера в моем веб-проекте. – bflemi3

ответ

1

Что я делаю, чтобы предотвратить эту ошибку, чтобы возвращать тип Anonymouse, который отражает свойства моего объекта, как это:

public JsonResult CompanyListJson() 
    { 
     var list = (from companies in appContext.Companies 
        where companies.Active.Equals(true) 
        select new 
        { 
         Name = companies.DbName, 
         Id = companies.Id, 
         Active = companies.Id.Equals(CurrentCompany.Id) 

        }); 
     return Json(list, JsonRequestBehavior.AllowGet); 
    } 

Может быть, это не самый лучший способ, но это позволяет мне держать мои JSON тонкие и нажимайте только те данные, которые мне нужны (и, конечно же, избегайте этого циклического исключения ссылок)

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

+0

Первоначально я думал об этом, хотя мне нужно вызвать несколько других методов на SearchAnalysis для заполнения некоторых свойств после извлечения из базы данных. – CodeWarrior

+0

и почему это противоречит использованию LINQ для создания новой anynoumous коллекции в качестве последнего шага? :) – torm

+0

Я предполагаю, что это был косвенный способ спросить, возвращают ли возвращаемые анонимные типизированные объекты, чтобы я вызывал методы экземпляра, чтобы заполнить их с помощью неменованных значений свойств. – CodeWarrior

Смежные вопросы