Я отразил код класса JSON.NET JavaScriptDateTimeConverter, скопировал его и переименовал класс AS3DateTimeConverter, чтобы я мог изменить его для форматирования объектов DateTime в более точном и строго типизированном поместье.
У меня он выводит тип в соответствии с тем, как JSON.NET выводит строго типизированные объекты, например: {"$type":"System.DateTime, mscorlib","ticks":0}
Переопределенный метод WriteJson JsonConverter запускается для получения этого значения.
Однако, когда я пытаюсь десериализовать строку, используя те же самые настройки с тем же конвертером, переопределенный метод ReadJson никогда не получает возможности запустить и построить DateTime из свойства ticks, потому что возникают следующие ошибки:
Невозможно десериализовать текущий объект JSON (например, {"name": "value"}) в тип 'System.DateTime', поскольку для правильной десериализации типу требуется примитивное значение JSON (например, строка, число, логическое значение, null).
Чтобы исправить эту ошибку, либо измените JSON на примитивное значение JSON (например, строку, число, логическое значение, null), либо измените десериализованный тип, чтобы он был обычным типом .NET (например, не примитивным типом, таким как целое число, а не типом коллекции как массив или список), который можно десериализовать из объекта JSON. JsonObjectAttribute также можно добавить к типу, чтобы заставить его десериализоваться из объекта JSON.
Путь 'галочки', строка 1, позиция 45.
Это какая-то ошибка или ограничение, которое не позволяет мне оживить тип DateTime, потому что это тип значения? Или я что-то упускаю?
Вот настройки сериализации:
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.ReferenceLoopHandling = ReferenceLoopHandling.Serialize;
settings.PreserveReferencesHandling = PreserveReferencesHandling.All;
settings.ObjectCreationHandling = ObjectCreationHandling.Replace;
settings.ConstructorHandling = ConstructorHandling.Default;
settings.TypeNameHandling = TypeNameHandling.All;
settings.TypeNameAssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple;
settings.DateFormatHandling = DateFormatHandling.IsoDateFormat;
settings.DateParseHandling = DateParseHandling.DateTime;
settings.Converters.Add( new AS3DateTimeConverter() );
//settings.Binder = new AS3SerializationBinder();
string s = JsonConvert.SerializeObject( new DateTime( 1970, 1, 1, 0, 0, 0, DateTimeKind.Utc ), settings );
object o = JsonConvert.DeserializeObject( s, settings ); //s = "{\"$type\":\"System.DateTime, mscorlib\",\"ticks\":0}" //ERROR OCCURS HERE
"$type":"System.DateTime", метод конвертера CanConvert никогда не вызывается с этим типом, а метод ReadJson конвертера никогда не вызывается. Как будто он даже не пытается использовать мой конвертер и даже не тестирует, можно ли его использовать. Возможно, это проблема обязательности, но я думал, что это произошло автоматически. - person Triynko   schedule 26.11.2013{"$type":"mynamespace.DateTimeWrapper","ticks":0}создается сериализацией, но, как ни странно, при попытке десериализации строки Вызывается метод CanConvert моего JsonConverter, но он получает целочисленный тип вместо типа mynamespace.DateTimeWrapper. Я считаю это странным. Как и предполагалось, он игнорирует $ type, встроенный в строку объекта JSON во время десериализации. - person Triynko   schedule 26.11.2013DateTime. Но если вы заключите DateTime в другой объект, это сработает. - person Brian Rogers   schedule 26.11.2013DateTime- это верхний уровень, это не работает, но когда это не так, то работает. Так что, если ваше свидание никогда не будет на высшем уровне, тогда все будет в порядке. - person Brian Rogers   schedule 26.11.2013