XML-сериализация без расположения

Я решаю это с помощью Jsoup.

Document doc = Jsoup.connect(url)
                .data("__EVENTTARGET","ctl00$ContentPlaceHolder1$btnSend")
                .data("__EVENTARGUMENT:","")
                .data("q", "")
                .data("ctl00$ContentPlaceHolder1$txtQuery1", delno)
                .post();

Я думаю, что это немного похоже на запрос в скрапе.

Надеюсь, это может помочь кому-то в замешательстве.

6
задан John Saunders 17 May 2009 в 20:33
поделиться

4 ответа

Проблема в том, что во втором примере вы открываете дескриптор файла, от которого никогда не избавлялись, поэтому при втором вызове метода он вызовет описываемое вами исключение. Первый фрагмент является предпочтительным способом (вы можете удалить бит file_stream.Close () - он будет автоматически вызываться Stream.Dispose ()).

11
ответ дан 8 December 2019 в 18:41
поделиться

Если у вас не было оператора using, но вы сохранили закрытие, все было бы в порядке.

[Edit: добавлена ​​попытка ... наконец, спасибо, cheeso]

var serializer = new XmlSerializer(typeof(PasswordManager));
FileStream fs;
try
{
    fs = File.Create("users.xml");
    serializer.Serialize(fs, this);
}
finally
{
    fs.Close(); // or fs.Dispose()
}

В этом случае, однако, Dispose предпочтительнее, потому что он знает все действия, которые необходимо предпринять для очистки, включая close (и все остальное).

0
ответ дан 8 December 2019 в 18:41
поделиться

Вы должны сериализовать в блоке try finally , чтобы можно было убедиться, что файл закрыт / удален независимо от успеха или неудачи. Вот что делает для вас ключевое слово using .

var serializer = new XmlSerializer(typeof(PasswordManager));
var fs = File.Create("users.xml");
try { serializer.Serialize(fs,this); }
finally { fs.Close(); }
2
ответ дан 8 December 2019 в 18:41
поделиться

File.Create должен быть размещен вне блока try, как показано в моем предыдущем ответе. Если вы поместите его в блок try, вам необходимо проверить fs на наличие нулевой ссылки перед закрытием. Ниже показан исправленный код, но мой первый ответ намного лучше, поскольку вы можете избежать этой проверки.

serializer = new XmlSerializer(typeof(PasswordManager));
FileStream fs;
try
{
    fs = File.Create("users.xml");
    serializer.Serialize(fs, this);
}
finally
{
    if (fs != null)  // in case File.Create fails
        fs.Close(); // or fs.Dispose()
}
0
ответ дан 8 December 2019 в 18:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: