SignalR参数序列化问题

本文关键字:问题 序列化 参数 SignalR | 更新日期: 2023-09-27 18:24:11

SignalR有一个奇怪的问题,我有一个简单的集线器,它接受这样的模型:

public class Entry
{
    public string Version { get; set; }
    public Guid PersistedId
    {
        get { return Id; }
        set { Id = value; }
    }
    public Guid Id { get; set; }
    public Guid ParentId { get; set; }
    [Required]
    public string Content { get; set; }
    public DateTime DateCreated { get; set; }
    public Guid CreatorAccountId { get; set; }
}

然后我查看请求对象,转到服务器的帖子是:

{"H":"entryhub","M":"SendEntry","A":["{'"Version'":'"1.0.0'",'"PersistedId'":'"00000000-0000-0000-0000-000000000000'",'"ParentId'":'"1764a2e3-ff6f-4a17-9c5f-d99642301dbf'",'"Content'":'"test'",'"DateCreated'":'"2013-07-21T14:06:01.980Z'",'"CreatorAccountId'":'"00000000-0000-0000-0000-000000000000'"}"],"I":2}

我一直收到回复,但有一个例外:

{"I":"2","E":"Error converting value '"{'"Version'":'"1.0.0'",'"PersistedId'":'"00000000-0000-0000-0000-000000000000'",'"ParentId'":'"1764a2e3-ff6f-4a17-9c5f-d99642301dbf'",'"Content'":'"test'",'"DateCreated'":'"2013-07-21T14:06:01.980Z'",'"CreatorAccountId'":'"00000000-0000-0000-0000-000000000000'"}'" to type 'SharedPlugin.Models.Entry'. Path '', line 1, position 266.","T":"   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.EnsureType(JsonReader reader, Object value, CultureInfo culture, JsonContract contract, Type targetType)'r'n   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)'r'n   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)'r'n   at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)'r'n   at Newtonsoft.Json.JsonSerializer.Deserialize(JsonReader reader, Type objectType)'r'n   at Newtonsoft.Json.JsonSerializer.Deserialize(TextReader reader, Type objectType)'r'n   at Microsoft.AspNet.SignalR.Json.JRawValue.ConvertTo(Type type)'r'n   at Microsoft.AspNet.SignalR.Hubs.DefaultParameterResolver.ResolveParameter(ParameterDescriptor descriptor, IJsonValue value)'r'n   at System.Linq.Enumerable.<ZipIterator>d__7a`3.MoveNext()'r'n   at System.Linq.Buffer`1..ctor(IEnumerable`1 source)'r'n   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)'r'n   at Microsoft.AspNet.SignalR.Hubs.DefaultParameterResolver.ResolveMethodParameters(MethodDescriptor method, IList`1 values)'r'n   at Microsoft.AspNet.SignalR.Hubs.HubDispatcher.InvokeHubPipeline(IHub hub, IJsonValue[] parameterValues, MethodDescriptor methodDescriptor, HubRequest hubRequest, StateChangeTracker tracker)"}

现在我想可能是Json.net在底层序列化方面有问题,但我写了一个单元测试,从post请求中获取完全相同的Json字符串,并将其反序列化为Entry对象,它运行良好。

我已经在网上查过了,但似乎没有太多关于这个错误的信息。我认为它可能是日期,但我已经尝试设置我自己的JsonNetSerializer,并更改它处理日期、null、缺少成员等的方式,但似乎没有任何帮助,而且在单元测试中,它除了默认值之外没有其他设置,工作正常,所以这意味着它不是Json.net的问题。

SignalR参数序列化问题

发现问题,原因是双重序列化,因为我在对象上调用ko.toJSON,而不是ko.toJS.

ko.toJSON——这会生成一个JSON字符串,表示视图模型的数据在内部,它只是在视图模型上调用ko.toJS,然后使用浏览器的原生>对结果执行JSON序列化程序。注意:为了在没有本机JSON>的旧浏览器上工作;序列化程序(例如,IE7或更早版本),您还必须引用json2.js库。

ko.toJS——这克隆了视图模型的对象图,用>该可观察值的当前值,因此您得到一个仅包含您的数据且不包含>击倒相关工件

只有在与dfowler交谈后,我才意识到情况确实如此,请求数据将json显示为单个字符串,而不是预期的完整json对象。所以不要双重连载!