关于c#:在序列化System.Globalization.CultureInfo类型的对象时检测到循环引用

A circular reference was detected while serializing an object of type System.Globalization.CultureInfo

我正在使用jquery来调用webservice,它返回一个包含几个表的数据集。

这工作正常,直到我需要设置我的webmethod接受参数。 我在客户端反映了这一点

1
data:"{paramname:'" + paramval+"'}",

我现在在webmethod返回时收到以下错误。 无论数据集中返回什么,都会发生这种情况

Error:{"Message":"A circular reference was detected while serializing
an object of type
\u0027System.Globalization.CultureInfo\u0027.","StackTrace":" at
System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(Object
o, StringBuilder sb, Int32 depth, Hashtable objectsInUse,
SerializationFormat serializationFormat)

at ...etc

当webmethod没有参数时,客户端js看起来与下面相同,除了data:line被删除。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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); }
    }
});

}

编辑:根据建议将请求更改为

1
data: {paramname: paramval},

产生以下错误。

Error:{"Message":"Invalid JSON primitive: paramval.","StackTrace":"
at
System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializePrimitiveObject()

at
System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32
depth)

at
System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String
input, Int32 depthLimit, JavaScriptSerializer serializer)

at
System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer
serializer, String input, Type type, Int32 depthLimit)

at
System.Web.Script.Serialization.JavaScriptSerializer.Deserialize[T](String
input)

at
System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest(HttpContext
context, JavaScriptSerializer serializer)

at
System.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData
methodData, HttpContext context)

at
System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext
context, WebServiceMethodData
methodData)","ExceptionType":"System.ArgumentException"} Status: 500


我改变了我的webmethod返回

1
ds.GetXml();

这很有效。考虑到数据集是可序列化的,我不知道为什么我必须这样做,但它让我克服了这个障碍。


当使用entityrefs和entitysets序列化对象时,通常会发生这种情况。
例如,如果你有这样的一套

1
 public EntitySet<ProductCategory> Subcategories

序列化程序将进入ProductCategory并尝试序列化那里的所有集合,通常最终返回原始对象,从而创建一个循环。

避免这种情况的最好方法是将[ScriptIgnore]和[NonSerialized]放在字段上,将[ScriptIgnore]放在这样的属性上。

1
2
3
4
5
6
    [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); } }

参考文献相同


我有同样的问题,

我从我的实体中删除了虚拟关键字,这使得延迟加载对象。

问题解决了!!


当存在类型转换异常服务器端时,我遇到了此响应。


我知道这个问题已得到解答,但我遇到了同样的问题,并认为我应该把对我有用的东西放在这里,以便其他人可以有希望解决这个问题。

1
data: JSON.stringify(Params),

通过使用JSON.stringify方法,我得到了所需的结果

其中params等于{"key":"value"}