【问题标题】:Is it possible to send a dictionary from server to c# client?是否可以将字典从服务器发送到 C# 客户端?
【发布时间】:2014-12-05 17:05:56
【问题描述】:

所以我可以发送简单的对象,比如字符串,这没问题。我还可以将相同的字典发送到我的 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);
}

感谢任何见解或想法。谢谢!

------------添加

进一步的测试表明,我使用元组 (string, string) 作为字典的键。显然 JSON 反序列化器不知道如何处理这个问题。给我错误:

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

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

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

所以现在决定,我要创建类型转换器吗?还是我使用更简单的有效收集结构发送数据。

【问题讨论】:

  • 您可以将RequestEntry 类添加到您的问题中吗?它应该在客户端和服务器上具有相同的实现。您还可以添加任何内容traced by the SignalR client吗?

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


【解决方案1】:

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

【讨论】:

  • 感谢您的快速回复。我在星期五试过你的建议。今天早上完成了我的测试。请查看我的编辑。
【解决方案2】:

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

[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 );
    }
}

此技术不适用于每个字典(例如,存储在异常中的字典),因为它们不能轻易地被此服务感知字典补充。

【讨论】:

  • 仅供参考 - 此技术还可用于将 Tuple 映射到 Generic 类型,这可能不会陷入相同的证券化问题。
  • 这是一个可靠的选择,但是我发现另一个问题回答了我在下面发布的确切问题。
【解决方案3】:

似乎真正的答案是肯定的,有可能,但你需要编写一个自定义的 JSON 转换器。尽管答案似乎有点不完整,但您可以在此处找到更多信息。

How to properly serialize tuple as key dictionary

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-02
    • 1970-01-01
    • 2021-02-15
    • 1970-01-01
    相关资源
    最近更新 更多