C# 为什么JavaScriptSerializer.Serialize()从未返回
我正在尝试将C#对象序列化为JSON对象。代码如下:C# 为什么JavaScriptSerializer.Serialize()从未返回,c#,asp.net,json,entity-framework-6,C#,Asp.net,Json,Entity Framework 6,我正在尝试将C#对象序列化为JSON对象。代码如下: QuestionGroup group = DatabaseMethods.GetQuestionGroup(questionGroupID); JavaScriptSerializer jSer = new JavaScriptSerializer(); string json = jSer.Serialize(group); 组在第1行之后的外观与预期一致。第三行从不返回任何内容,我无法进入函数;我只能看元数据,它没有提到这方面的任何内
QuestionGroup group = DatabaseMethods.GetQuestionGroup(questionGroupID);
JavaScriptSerializer jSer = new JavaScriptSerializer();
string json = jSer.Serialize(group);
组
在第1行之后的外观与预期一致。第三行从不返回任何内容,我无法进入函数;我只能看元数据,它没有提到这方面的任何内容。我没有得到例外;它只是…永远…不会回来
我要传递的对象是一个有孩子和孙子的非常可怕的类。这是EF课程;我不知道这是否会干扰JSON序列化程序。它应该可以接受任何物体,所以我不知道那会是什么;但谁知道呢
这是一个类,为了简洁起见删除了一些代码:
public class QuestionGroup
{
public Int32 QuestionGroupID { get; set; }
public Int32 Order { get; set; }
[Display(Name = "Path to File", Prompt = "Path to File")]
[DataType(DataType.Upload)]
[NotMapped]
public HttpPostedFileWrapper PathToFile { get; set; }
public String FileName { get; set; }
public virtual Image Image { get; set; }
public Int32? ImageID {get; set; }
public String Text { get; set; }
public DateTime WhenCreated { get; set; }
public Int32 CreatedBy { get; set; }
[NotMapped]
public Int32 MasteryCriteriaNumerator { get; set; }
[NotMapped]
public Int32 MasteryCriteriaDenominator { get; set; }
public Boolean TeacherAdministersToStudent { get; set; }
/*Foreign keys for associations*************************************************/
public Guid MasteryObjectiveID { get; set; }
/*Navigational properties for EF************************************************/
public MasteryObjective MasteryObjective {
get { return DAL.DatabaseMethods.GetMasteryObjective(MasteryObjectiveID); }
}
public List<Question> Questions{ get; set; }
public virtual List<Assessment> Assessments { get; set; }
public virtual List<MultipleChoiceResult> MultipleChoiceResults { get; set; }
// The full url to qg's image on rackspace
[NotMapped]
public String RackspaceFullURL { get { return GetRackspaceURL(QuestionGroupID, FileName); } }
private String GetRackspaceURL(Int32 QuestionGroup, String FileName)
{
//code removed
}
}
公共类问题组
{
公共Int32 QuestionGroupID{get;set;}
公共Int32顺序{get;set;}
[显示(Name=“文件路径”,Prompt=“文件路径”)]
[数据类型(DataType.Upload)]
[未映射]
公共HttpPostedFileWrapper路径文件{get;set;}
公共字符串文件名{get;set;}
公共虚拟映像映像{get;set;}
public Int32?ImageID{get;set;}
公共字符串文本{get;set;}
创建{get;set;}时的公共日期时间
公共Int32由{get;set;}创建
[未映射]
公共Int32 MasteryCriteriaNumerator{get;set;}
[未映射]
公共Int32 MasteryCriteriaDenominator{get;set;}
公共布尔型教师管理学生{get;set;}
/*关联的外键*************************************************/
公共Guid MasteryObjectiveID{get;set;}
/*EF的导航属性************************************************/
公共主语主语主语主语主语主语主语主语{
获取{return DAL.DatabaseMethods.GetMasteryObjective(MasteryObjectId);}
}
公共列表问题{get;set;}
公共虚拟列表评估{get;set;}
公共虚拟列表multipleChiiceResults{get;set;}
//rackspace上qg图像的完整url
[未映射]
公共字符串RackspaceFullURL{get{return GetRackspaceURL(QuestionGroupID,FileName);}
私有字符串GetRackspaceURL(Int32问题组,字符串文件名)
{
//代码删除
}
}
您可能遇到StackOverflowException
。但是,JavaScriptSerializer
会检测循环引用,并在遇到循环引用时引发异常,因此此类异常的最可能原因不适用于此处。尝试添加到连续属性以缩小问题范围。@dbc我将[ScriptIgnore]
放在我一直怀疑的属性上,得到了不同的结果。现在它抛出一个{“ObjectContext实例已被释放,不能再用于需要连接的操作。”}
。尝试禁用延迟加载属性,正如这里所讨论的:您能在处理DbContext之前序列化为JSON吗?嗯……所以我尝试在实际的数据库方法中序列化JSON,所以它是在处理DbContext之前完成的……但这表明问题不在于我认为的属性。事实上,我将该属性应用于几乎所有属性,但仍然存在相同的问题(它永远不会返回任何内容)。所以在这一点上…我在这方面花了太多时间,所以我只想硬编码一个方法,手动将对象映射到JSON对象-(