所以我能够像字符串一样发送简单的对象没问题。我也可以将相同的字典发送到我的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自动序列化)
现在要决定,我是否要创建类型转换器?或者我使用更简单的收集结构发送数据。
答案 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转换器。你可以在这里找到更多信息,虽然答案看起来有点不完整。