Проблемы с сериализацией Json.NET в Glimpse - PullRequest
2 голосов
/ 15 декабря 2011

Я тестировал Glimpse на кроссплатформенном прототипе, который использует MVVM для различных интерфейсов (MVC3, WPF4, WP7) и, похоже, столкнулся с проблемами с Glimpse в MVC3 из-за проблем с сериализацией Json.NET. Glimpse отлично работает для представлений, не использующих MVVM.

Использование MVVMLight v3.0.3, Autofac для DI v2.5.2 и Glimpse v0.86.

Вот журнал Glimpse:

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: Token PropertyName в состоянии Property приведет к недопустимому объекту JavaScript , и кажется, другие люди слишком ,

Кто-нибудь знает, к чему относятся токен X и состояние X ?

1 Ответ

2 голосов
/ 15 декабря 2011

Это известная проблема - я удивлен, что JsonIgnore не работал, так как это должно было сработать ...

В более общем плане, начиная с представления сериализации моделей представлений, у нас возникли проблемы с выполнением того, что вы «не должны» делать. Самый большой пример этого - люди, использующие модели EF / NH в качестве своей виртуальной машины, и процесс сериализации, который мы запускаем, запускает рекурсивную ленивую загрузку всей базы данных.

Мы понимаем, что заставлять людей менять свой код на работу не очень хороший подход, и поэтому мы по умолчанию отключаем процесс сериализации.

К сожалению, этого еще нет, так что я не могу предложить вам их немного, но знайте, что мы находимся на этом, и мы скоро исправим.

UPDATE:

Я только что подумал. Glimpse поддерживает плагины для внесения в черный список - http://getglimpse.com/Help/Configuration. Это означает, что вы можете остановить запуск плагина Views и вызвать проблемы. Если вы по-прежнему хотите, чтобы плагин вида работал, то вы можете сделать что-то более хакерское, установив «модель» в ноль в строке 73 - https://github.com/Glimpse/Glimpse/blob/master/source/Glimpse.MVC3/Plugin/Views.cs.

Опять же, я знаю, что ни один из них не идеален, но это заставляет вас работать здесь и сейчас.

...