JSON. NET JObject.Load () отключен JSON - PullRequest
1 голос
/ 11 марта 2020

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

, если он был создан на JObject.Parse(File.ReadAllText(jsonFile)); тогда у меня все в порядке, все JSON находится в памяти и не будет уничтожено до тех пор, пока JObject не будет уничтожено ..

, но если оно было создано из JsonTextReader с использованием JObject.Load() ...
Мой вопрос: что произойдет, если поток закрыт?
Работает ли JObject по-прежнему нормально или он недействителен?

Я поставил проверку в «песочницу», и она, кажется, работает даже после удаления FileStream, но я не уверен, что это «пуленепробиваемый» файл, скажем, больший JSON файл или глубоко вложенный.

если он недействителен, как я могу сказать JSON. NET создать из него объект "в памяти"?

Редактировать жирным шрифтом

Большое спасибо.

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Неважно, был ли JObject создан из строки или из потока; JObject и содержащиеся в нем данные будут оставаться в памяти до тех пор, пока вы не выберете JObject из области видимости. Закрытие исходного потока не приводит к потере данных JObject.

Если вы не уверены в собственном тестировании в песочнице, лучшим доказательством, которое вы найдете, является проверка исходного кода * 1008. * сам. Если вы посмотрите на класс JObject и его базовый класс JToken, вы увидите, что, хотя у них есть методы для чтения данных из JsonReader, они не держите ссылку на читателя за пределами этих методов. Ни у одного класса нет ссылок на Streams.

И наоборот, классы JsonReader и JsonTextReader не имеют ссылок на JToken или JObject вообще. Если вы посмотрите на класс JsonReaderInternalSerializer, то увидите, что у него есть методы для создания JTokens и JObjects, но при этом для копирования используется JTokenWriter данные в эти объекты. Между ними нет никакой постоянной связи.

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

0 голосов
/ 11 марта 2020

Вы читаете весь текст одновременно File.ReadAllText(jsonFile)

Открывает текстовый файл, считывает весь текст в файле в строку, а затем закрывает файл .

Как только данные (в вашем случае выделенная строка в памяти) анализируются с использованием (JObject.Parse метода), JObject дополнительно allocated и остается в памяти , подкрепленной данными, которые вы ему предоставили (пока они не выпадут из scope ).

Если вы редактируете или делаете что-то еще, исходный источник не редактируется.

Это так просто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...