1

wcf サービス (JSON 出力) のシリアル化に問題があります。DynamicObject を使用して、REST サービスのライト 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]);
        }
    }
}

したがって、この JSON 結果 {values: [1,2]} の代わりに、このエラー Error 324 (net::ERR_EMPTY_RESPONSE) が発生しました

4

2 に答える 2

1

解決策を見つけました。シリアル化可能なリストを手動で宣言する必要があります。

私の例では、結果オブジェクトに属性 KnownType を追加できます

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

もう 1 つの解決策は、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 に答える