序列化 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

System.Globalization.CultureTypes.cs

System.Globalization.CultureInfo.cs