我一直在跨平台原型上测试Glimpse,该原型使用MVVM用于各种前端(MVC3, WPF4, WP7),并且由于Json似乎在MVC3中遇到了Glimpse问题。. NET序列化问题。对于不使用MVVM的视图,一瞥工作得很好。
使用MVVMLight v3.0.3, Autofac for DI v2.5.2和Glimpse v0.86。
这是一瞥日志:
<>之前2011-12-14 11:23:39.9096 |信息| Glimpse.Core。模块|BeginRequest处理完成requesttid 2e9285ee-a2ac-44fe-bd26-e85fb2f83b1b (/)|2011-12-14 11:23:39.9096 | |警告Glimpse.Mvc3.Plugin。System.Web.Mvc.ControllerActionInvoker类型的get_bindings方法不可代理2011-12-14 11:23:39.9096 | |警告Glimpse.Mvc3.Plugin。System.Web.Mvc.ControllerActionInvoker类型的set_bindings方法不可代理2011-12-14 11:23:39.9096 | |警告Glimpse.Mvc3.Plugin。执行| System.Web.Mvc.ControllerActionInvoker类型的GetType方法不可代理2011-12-14 11:23:39.9096 | |警告Glimpse.Mvc3.Plugin。System.Web.Mvc.ControllerActionInvoker类型的MemberwiseClone方法不可代理2011-12-14 11:23:39.9356 |信息| Glimpse.Core。模块|PostRequestHandlerExecute处理完成的requestId 2e9285ee-a2ac-44fe-bd26-e85fb2f83b1b (/)|2011-12-14 11:23:39.9356 |信息| Glimpse.Core。模块|PostReleaseRequestState处理完成requestId 2e9285ee-a2ac-44fe-bd26-e85fb2f83b1b (/)|2011-12-14 11:23:39.9576 | |警告Glimpse.Core.Plumbing。GlimpseSerializer | |系统序列化器错误。"CommandConverter"无法转换"GalaSoft.MvvmLight.Command"。RelayCommand' to 'System.String'。——在System.ComponentModel.TypeConverter。GetConvertToException(对象值,类型destinationType)在System.Windows.Input.CommandConverter。ConvertTo(ITypeDescriptorContext context, CultureInfo culture, Object value, Type destinationType)在System.ComponentModel.TypeConverter。ConvertToString(ITypeDescriptorContext上下文,CultureInfo文化,对象值)在System.ComponentModel.TypeConverter。ConvertToInvariantString(对象值)在Newtonsoft.Json.Serialization.JsonSerializerInternalWriter。TryConvertToString(对象值,类型类型,字符串& s)在Newtonsoft.Json.Serialization.JsonSerializerInternalWriter。SerializeString(JsonWriter writer, Object value, JsonStringContract contract)在Newtonsoft.Json.Serialization.JsonSerializerInternalWriter。SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty成员,JsonContract collectionValueContract)在Newtonsoft.Json.Serialization.JsonSerializerInternalWriter。writemberinfoproperty (JsonWriter writer, Object memberValue, JsonProperty property, JsonContract contract)在Newtonsoft.Json.Serialization.JsonSerializerInternalWriter。SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty成员,JsonContract collectionvalueconcontract)2011-12-14 11:23:39.9756 | |警告Glimpse.Core.Plumbing。GlimpseSerializer | |序列化器错误Newtonsoft.Json。JsonWriterException——状态属性中的Token PropertyName会导致无效的JavaScript对象。——在Newtonsoft.Json.JsonWriter。自动完成(JsonToken tokenBeingWritten)在Newtonsoft.Json.JsonWriter。WritePropertyName(字符串名称)在Newtonsoft.Json.JsonTextWriter。WritePropertyName(字符串名称)在Newtonsoft.Json.Serialization.JsonSerializerInternalWriter。writemberinfoproperty (JsonWriter writer, Object memberValue, JsonProperty property, JsonContract contract)在Newtonsoft.Json.Serialization.JsonSerializerInternalWriter。SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty成员,JsonContract collectionvalueconcontract)…等等之前对于NotSupportedException
,我尝试用[JsonIgnore]
或[ScriptIgnore]
标记相关的模型/视图模型字段[NonSerialized]
和属性,但无济于事,因为CommandConverter
似乎是症结所在,因为RelayCommand
实现了ICommand
:
[TypeConverter("System.Windows.Input.CommandConverter, PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, Custom=null"), ValueSerializer("System.Windows.Input.CommandValueSerializer, PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, Custom=null")]
public interface ICommand
有谁知道怎么解决这个问题吗?
另外,我无法解释状态属性中的JsonWriterException
: 令牌PropertyName会导致无效的JavaScript对象,似乎其他人也是如此。
这是一个已知的问题-我很惊讶JsonIgnore没有工作,因为它应该工作的东西…
更一般地说,自从引入了视图模型的序列化,我们就遇到了"不应该"做的事情出现问题的问题。最大的例子是人们使用EF/NH模型作为他们的VM,我们运行的序列化过程触发了整个数据库的递归延迟加载。
我们意识到让人们修改他们的代码来工作不是一个好方法,因此我们将默认关闭序列化过程。
不幸的是,这还没有到位,所以他们没有太多我可以提供给你,但知道我们正在处理它,我们很快就会有一个解决方案。
更新:我刚有个想法。一瞥支持黑名单插件- http://getglimpse.com/Help/Configuration。这意味着你可以停止Views插件的运行和产生问题。如果您仍然希望视图插件工作,您可以做一些更hack的事情,即在第73行- https://github.com/Glimpse/Glimpse/blob/master/source/Glimpse.MVC3/Plugin/Views.cs中将"model"设置为null。
我知道这两种方法都不理想,但它能让你马上振作起来。