是否可以从服务器向c#客户端发送字典?

时间:2014-12-05 17:05:57

标签: c# asp.net .net signalr signalr.client

所以我能够像字符串一样发送简单的对象没问题。我也可以将相同的字典发送到我的javascript客户端。但是,我似乎无法让我的C#客户端接收它。我假设这是因为在javascript客户端中,发送的类型不需要指定,但在C#中它确实如此。

这是客户端设置

 connection = new HubConnection(ServerURI);
 hubProxy = connection.CreateHubProxy("ControllerHub");
 hubProxy.On<Dictionary<Tuple<string, string>, RequestEntry>>("ReceiveTickerStateData", overviewDictionary => receiveTickerStateData(overviewDictionary));
 connection.Start().Wait();

这里是被触发发送字典的服务器代码,但客户端从未接收过它。

public void GetTickerStateData()
{
    Clients.Caller.ReceiveTickerStateData(DealTickerState.Instance.GetRequestDict);
}

任何见解或想法都表示赞赏。谢谢!

------------------------附加

进一步测试已经证明,我使用元组(字符串,字符串)作为字典的键是事实。显然JSON解串器不知道如何处理这个问题。给我错误:

无法将字符串(DEFAULT, IDCO)转换为字典键类型

  

System.Tuple`2 [System.String,System.String]。创建一个TypeConverter   从字符串转换为键类型对象。路径&#39; [&#39;(默认,   IDCO)&#39;]&#39;,第1行,第19位。

我通过手动序列化和发送字符串得到了这个 我尝试发送一个只有一个字符串作为键的字典,它既可以作为序列化字符串也可以正常工作。 (即signalR自动序列化)

现在要决定,我是否要创建类型转换器?或者我使用更简单的收集结构发送数据。

3 个答案:

答案 0 :(得分:2)

是的,作为JSON。使用JSON.NET,包含的JavaScriptSerializer将无法正常工作。你可以从NuGet获得JSON.NET。将字典转换为JSON并将其作为字符串发送。在客户端,只需使用内置的JSON.parse()方法对其进行反序列化。

答案 1 :(得分:1)

您还可以创建一个在传输过程中存储字典的中间类型(我使用List<KeyValuePair<T1,T2>>),重要的是您在从反序列中对此进行反序列化时验证没有任何重复键。客户端。

[Serializable]
public class SerializableDictionary<T1,T2>
{
    public List<KeyValuePair<T1,T2>> SerializedDictionary { get; set; }

    public SerializableDictionary( Dictionary<T1,T2> dictionary )
    {
        if( dictionary != null && dictionary.Count > 0 )
        {
            SerializedDictionary = dictionary.Select( item => item ).ToList();
        }
        else 
        {
            throw new ArgumentNullException( "Cannot serialize a null or empty dictionary" );
        }
    }

    public static explicit operator SerializableDictionary<T1,T2>(Dictionary<T1,T2> dictionary) 
    {
        return new SerializableDictionary<T1,T2>(dictionary);
    }

    public static explicit operator Dictionary<T1,T2>(SerializableDictionary<T1,T2> dictionary) 
    {
        if ( dictionary.SerializedDictionary == null ) return null;
        return dictionary.SerializedDictionary.ToDictionary( item => item.Key, item => item.Value );
    }
}

这种技术不适用于每个字典(例如,存储在例外中的字典),因为它们不能很容易地为这个服务感知字典补充。

答案 2 :(得分:0)

似乎真正的答案是肯定的,这是可能的,但你需要编写一个自定义的JSON转换器。你可以在这里找到更多信息,虽然答案看起来有点不完整。

How to properly serialize tuple as key dictionary