1

我对 wcf 服务(JSON 输出)的序列化有疑问。我使用 dynamicobject 为我的 REST 服务返回 ligth JSON。

此代码返回一个空结果(无法序列化):

public DynamicJsonObject DoWork()
{
    dynamic result = new DynamicJsonObject();
    result.values = new List<int>() { 1, 2 };
}

但这段代码完美无缺

public DynamicJsonObject DoWork()
{
    dynamic result = new DynamicJsonObject();
    result.values = 1;
}

我的 DynamicJsonObject 类是:

[Serializable]
public class DynamicJsonObject : DynamicObject, ISerializable
{
    private IDictionary<String, Object> Dictionary { get; set; }

    public DynamicJsonObject()
    {
        Dictionary = new Dictionary<String, Object>();
    }

    public DynamicJsonObject(SerializationInfo info, StreamingContext context)
    {
        Dictionary = new Dictionary<String, Object>();
    }

    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        var hasKey = Dictionary.ContainsKey(binder.Name);
        result = hasKey ? Dictionary[binder.Name] : null;
        return hasKey;
    }

    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        Dictionary[binder.Name] = value;
        return true;
    }

    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        foreach (String key in Dictionary.Keys)
        {
            info.AddValue(key.ToString(), Dictionary[key]);
        }
    }
}

所以我得到了这个错误 Error 324 (net::ERR_EMPTY_RESPONSE) 而不是这个 JSON 结果 {values: [1,2]}

4

2 回答 2

1

我找到了解决方案。您应该手动声明可序列化的列表。

在我的示例中,我可以在结果对象上添加属性 KnownType

[Serializable]
[KnownType(typeof(List<int>))]
public class DynamicJsonObject : DynamicObject, ISerializable
{
    ...
}

另一种解决方案是在 wcf 服务类上使用 ServiceKnownType

[ServiceContract]
[ServiceKnownType(typeof(List<int>))]
public interface IDataService
{
    ...
}

有关信息,您可以使用通用属性,例如 KnownType(typeof(List)

于 2013-05-15T09:24:37.100 回答
0
List<UserDetails> list = new List<UserDetails>();//UserDetails is my class name it has some properties

对于序列化,您可以使用以下代码:

var objSerializer = new System.Web.Script.Serialization.JavaScriptSerializer();
string sJSON = objSerializer.Serialize(list);
return list;
于 2013-05-13T08:21:01.793 回答