Я слышал, что Json.NET быстрее, чем DataContractJsonSerializer, и хотел попробовать ...
Но я не смог найти какие-либо методы на JsonConvert, которые принимают поток, а не строку.
Например, для десериализации файла, содержащего JSON на WinPhone, я использую следующий код, чтобы прочитать содержимое файла в строку, а затем десериализовать в JSON. В моем (очень специальном) тестировании это примерно в 4 раза медленнее, чем при использовании DataContractJsonSerializer для десериализации прямо из потока ...
// DCJS
DataContractJsonSerializer dc = new DataContractJsonSerializer(typeof(Constants));
Constants constants = (Constants)dc.ReadObject(stream);
// JSON.NET
string json = new StreamReader(stream).ReadToEnd();
Constants constants = JsonConvert.DeserializeObject<Constants>(json);
Я делаю это неправильно?
источник
Текущая версия Json.net не позволяет использовать принятый код ответа. Текущая альтернатива:
Документация: десериализация JSON из файлового потока
источник
stream.Position = 0;
чтобы правильно десериализовать мой JSON.источник
JsonSerializer ser = JsonSerializer.Create(settings);
вы можете определить, какие настройки использовать при де / сериализации.Serialize
реализацией заключается в том, что она закрываетStream
переданный в качестве аргумента, что может быть проблемой в зависимости от приложения. В .NET 4.5+ вы можете избежать этой проблемы, используяStreamWriter
перегрузку конструктора с параметром,leaveOpen
который позволяет оставить поток открытым.Я написал класс расширения, чтобы помочь мне десериализовать из источников JSON (строка, поток, файл).
Десериализацию теперь так же просто, как написать:
Надеюсь, это поможет кому-то еще.
источник
Using SomeJsonHelpersNamespace
при необходимости или удаляйтеthis
ключевое слово и используйтеJsonHelpers.CreateFromJsonString(someJsonString)
Pro : так проще в использовании :)Encoding.Default
плохо, так как на разных машинах он будет вести себя по-разному (см. Большое предупреждение в документе Microsoft). Ожидается, что JSON будет UTF-8, и именно этого ожидает JsonSerializer. Так и должно бытьEncoding.UTF8
. Код как есть будет создавать искаженные строки или не сможет десериализоваться, если используются символы не ASCII.Я пришел к этому вопросу, ища способ для потоковой передачи открытого списка объектов на
System.IO.Stream
и считывания их с другого конца, без буферизации всего списка перед отправкой. (В частности, я передаю постоянные объекты из MongoDB через Web API.)@Paul Tyng и @Rivers отлично ответили на первоначальный вопрос, и я использовал их ответы, чтобы создать доказательство концепции моей проблемы. Я решил опубликовать свое тестовое консольное приложение здесь на случай, если кто-то еще столкнется с той же проблемой.
Обратите внимание, что вы можете получить исключение при
AnonymousPipeServerStream
утилизации, я проигнорировал это, поскольку это не имеет отношения к рассматриваемой проблеме.источник
{"sign in":{"username":"nick"}}{"buy item":{"_id":"32321123"}}
и он должен видеть это как два фрагмента JSON, сигнализирующих о событии каждый раз, когда он читает фрагмент. В nodejs это можно сделать в трех строках кода.