2011-12-15 63 views
2

我一直在測試一個跨平臺原型,它使用MVVM的各種前端(MVC3,WPF4,WP7),似乎已經遇到MVC3中的瞥見問題到Json.NET序列化的困境。對於不使用MVVM的視圖,Glimpse工作正常。在瞥見Json.NET序列化的問題

使用MVVMLight v3.0.3,Autofac for DI v2.5.2和Glimpse v0.86。

這裏的一瞥日誌:

 
2011-12-14 11:23:39.9096|INFO|Glimpse.Core.Module|BeginRequest handling complete for requestId 2e9285ee-a2ac-44fe-bd26-e85fb2f83b1b (/)| 
2011-12-14 11:23:39.9096|WARN|Glimpse.Mvc3.Plugin.Execution|get_Binders method of System.Web.Mvc.ControllerActionInvoker type is not proxyable.| 
2011-12-14 11:23:39.9096|WARN|Glimpse.Mvc3.Plugin.Execution|set_Binders method of System.Web.Mvc.ControllerActionInvoker type is not proxyable.| 
2011-12-14 11:23:39.9096|WARN|Glimpse.Mvc3.Plugin.Execution|GetType method of System.Web.Mvc.ControllerActionInvoker type is not proxyable.| 
2011-12-14 11:23:39.9096|WARN|Glimpse.Mvc3.Plugin.Execution|MemberwiseClone method of System.Web.Mvc.ControllerActionInvoker type is not proxyable.| 
2011-12-14 11:23:39.9356|INFO|Glimpse.Core.Module|PostRequestHandlerExecute handling complete for requestId 2e9285ee-a2ac-44fe-bd26-e85fb2f83b1b (/)| 
2011-12-14 11:23:39.9356|INFO|Glimpse.Core.Module|PostReleaseRequestState handling complete for requestId 2e9285ee-a2ac-44fe-bd26-e85fb2f83b1b (/)| 
2011-12-14 11:23:39.9576|WARN|Glimpse.Core.Plumbing.GlimpseSerializer|Serializer error|System.NotSupportedException--'CommandConverter' is unable to convert 'GalaSoft.MvvmLight.Command.RelayCommand' to 'System.String'.-- at System.ComponentModel.TypeConverter.GetConvertToException(Object value, Type destinationType) 
    at System.Windows.Input.CommandConverter.ConvertTo(ITypeDescriptorContext context, CultureInfo culture, Object value, Type destinationType) 
    at System.ComponentModel.TypeConverter.ConvertToString(ITypeDescriptorContext context, CultureInfo culture, Object value) 
    at System.ComponentModel.TypeConverter.ConvertToInvariantString(Object value) 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.TryConvertToString(Object value, Type type, String& s) 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeString(JsonWriter writer, Object value, JsonStringContract contract) 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContract collectionValueContract) 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.WriteMemberInfoProperty(JsonWriter writer, Object memberValue, JsonProperty property, JsonContract contract) 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContract collectionValueContract) 
2011-12-14 11:23:39.9756|WARN|Glimpse.Core.Plumbing.GlimpseSerializer|Serializer error|Newtonsoft.Json.JsonWriterException--Token PropertyName in state Property would result in an invalid JavaScript object.-- at Newtonsoft.Json.JsonWriter.AutoComplete(JsonToken tokenBeingWritten) 
    at Newtonsoft.Json.JsonWriter.WritePropertyName(String name) 
    at Newtonsoft.Json.JsonTextWriter.WritePropertyName(String name) 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.WriteMemberInfoProperty(JsonWriter writer, Object memberValue, JsonProperty property, JsonContract contract) 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContract collectionValueContract) 
... et cetera 

對於NotSupportedException我試圖標記相關聯的模型/視圖模型字段[NonSerialized]和屬性[JsonIgnore][ScriptIgnore]無濟於事,因爲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令牌屬性名國家財產會導致一個無效的JavaScript對象,似乎other people也有同感。

有沒有人知道什麼令牌X狀態X是指?

回答

2

這是一個已知的問題 - 我很驚訝,JsonIgnore沒有爲東西應該有工作工作...

更一般地,由於引入視圖模型的序列化,我們曾與問題進行問題你「不應該」做什麼。最大的例子是人們使用EF/NH模型作爲他們的虛擬機,我們運行的序列化過程觸發了整個數據庫的遞歸延遲加載。

我們意識到,讓人們改變他們的代碼來工作並不是一個好方法,因此我們將默認關閉序列化過程。

不幸的是,這還沒有到位,所以他們沒有多少我可以提供給你的,但是我們知道我們正在努力,我們很快就會有一個解決方案。

更新:

我只是有一個想法。 Glimpse支持黑名單插件 - http://getglimpse.com/Help/Configuration。這意味着您可以停止Views插件運行並導致問題。如果你仍然希望視圖插件能夠工作,那麼你可以做的事情是在73行上設置「model」爲null - https://github.com/Glimpse/Glimpse/blob/master/source/Glimpse.MVC3/Plugin/Views.cs

我再次知道,這兩者都不是理想的,但它會讓你在這裏和現在運行起來。

+0

謝謝安東尼!列入黑名單視圖插件讓事情滾動,但我會進一步試驗'JsonIgnore`,看看它是否可以解決問題。 – si618 2011-12-15 23:59:39