序列化 System.Globalization.CultureInfo 类型的对象时检测到循环引用
Posted
技术标签:
【中文标题】序列化 System.Globalization.CultureInfo 类型的对象时检测到循环引用【英文标题】:A circular reference was detected while serializing an object of type System.Globalization.CultureInfo 【发布时间】:2010-10-14 22:58:31 【问题描述】:我正在使用 jquery 调用一个 web 服务,它返回一个包含几个表的数据集。
在我需要设置我的 web 方法以接受参数之前,这一切正常。我用
在客户端反映了这一点data: "paramname:'" + paramval+ "'",
当 web 方法返回时,我现在收到以下错误。无论数据集中返回什么,都会发生这种情况
Error:"Message":"序列化时检测到循环引用 类型的对象 \u0027System.Globalization.CultureInfo\u0027.","StackTrace":" at System.Web.Script.Serialization.javascriptSerializer.SerializeValueInternal(对象 o,StringBuilder sb,Int32 深度,Hashtable objectsInUse, SerializationFormat serializationFormat)\r\n at ...等
当 webmethod 没有参数时,客户端 js 看起来和下面一样,除了 data: 行被删除。
function ClientWebService(paramval)
$.ajax(
type: "POST",
url: "WebService1.asmx/webmethodName",
data: "paramname:'" + paramval+ "'",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(msg)
ParseResult(msg.d);
,
error: function(err)
if (err.status == 200)
ParseResult(err);
else alert('Error:' + err.responseText + ' Status: ' + err.status);
);
编辑:根据建议将请求更改为
data: paramname: paramval,
产生以下错误。
错误:"Message":"无效的 JSON 原语:paramval。","StackTrace":" 在 System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializePrimitiveObject()\r\n 在 System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 深度)\r\n 在 System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(字符串 输入,Int32 depthLimit,JavaScriptSerializer 序列化程序)\r\n at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer 序列化程序、字符串输入、类型类型、Int32 depthLimit)\r\n at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize[T](字符串 输入)\r\n 在 System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest(HttpContext 上下文,JavaScriptSerializer 序列化程序)\r\n at System.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData 方法数据,HttpContext 上下文)\r\n 在 System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext 上下文,WebServiceMethodData methodData)","ExceptionType":"System.ArgumentException" 状态:500
【问题讨论】:
请注意,您将 json 数据作为字符串发送是正确的(与实际的 json 相比)。您可以尝试将问题改写为如何解决错误:“在”(这是服务器上发生的情况) 【参考方案1】:我改变了我的 webmethod 来返回
ds.GetXml();
这很有效。考虑到数据集是可序列化的,我不知道为什么必须这样做,但它让我克服了这个障碍。
【讨论】:
请您详细解释一下您是如何更改网络方法的?【参考方案2】:我遇到了同样的问题,
我从我的实体中删除了 Virtual 关键字,这会延迟加载对象。
问题解决了!!
【讨论】:
【参考方案3】:这通常会在使用 entityrefs 和 entitysets 序列化对象时发生。 例如,如果你有这样的一套
public EntitySet<ProductCategory> Subcategories
序列化器将进入ProductCategory
并尝试序列化那里的所有集合,通常最终回到原始对象,因此创建一个循环。
避免这种情况的最佳方法是将[ScriptIgnore]
和[NonSerialized]
放在字段上,将[ScriptIgnore]
放在这样的属性上。
[ScriptIgnore]
[NonSerialized]
private EntitySet < ProductCategory > _Subcategories;
[ScriptIgnore]
[Association(Storage = "_Subcategories", ThisKey = "ID", OtherKey = "ParentID")]
public EntitySet < ProductCategory > Subcategories
get
return this._Subcategories;
set
this._Subcategories.Assign(value);
参考文献相同
【讨论】:
【参考方案4】:我知道这个问题已经得到解答,但我遇到了同样的问题,我想我应该把对我有用的东西放在这里,这样其他人就可以解决这个问题。
data: JSON.stringify(Params),
通过使用 JSON.stringify 方法,我得到了所需的结果
其中 params 等于 "key":"value"
【讨论】:
【参考方案5】:当服务器端出现类型转换异常时,我遇到了这个响应。
【讨论】:
以上是关于序列化 System.Globalization.CultureInfo 类型的对象时检测到循环引用的主要内容,如果未能解决你的问题,请参考以下文章
System.Globalization.CalendarArgumentType.cs
System.Globalization.CalendarWeekRule.cs
System.Globalization.NumberFormatInfo.cs
System.Globalization.Calendar.cs