Чак Норрис
- Вопросы
- Ответы
Имя | Неизвестно |
Возраст | Неизвестно |
Сайт | Неизвестно |
Неизвестно | |
Участвует в проекте | 1103 дн., 22 час., 55 мин. |
Последняя активность | 535 дн., 7 час., 46 мин. назад |
Ответы
Перейти к вопросу →
MSTest — доступен в Visual Studio «из коробки». Соответственно имеется встроенная интеграция со средой, возможность легко посчитать покрытие кода тестами (code coverage). Еще интересная фича — тесты имеют доступ к приватным (private) полям и методам классов (черная магия?).
Перейти к вопросу →
Можно добавлять IFrame на страницу динамически, при помощи javascript.
Перейти к вопросу →
А функция GetFocus()
из библиотеки user32.dll
не для этого служит?
Перейти к вопросу →
На самом деле, конструктор класса QueryParser
в качестве первого параметра принимает поле по умолчанию. То есть если в запросе будет явно указано другое поле (например так: "title: search this text"), то поиск будет производиться именно по указанному полю.
Для поиска по нескольким полям одновременно можно использовать MultiFieldQueryParser
. Объект этого класса парсит запрос как стандартный QueryParser
для каждого из определенных полей и группирует полученные объекты Query
в один объект BooleanQuery
:
Query query = new MultiFieldQueryParser().parse("this is query",
new String[] {"field1", "field2"},
new SimpleAnalyzer());
IndexSearcher searcher = new IndexSearcher(directory);
Hits hits = searcher.search(query);
Стоит помнить, что объект MultiFieldQueryParser имеет ряд ограничений. Например, нельзя указать ряд настроек, предоставляемым стандартным парсером. И вообще поиск по нескольким полям считается плохим тоном. Гораздо чаще несколько полей реального документа переходят в одно поле индекса.
Перейти к вопросу →
Нужно использовать проект Highlighter из поставки Lucene.NET (папка contrib\Highlighter.Net). Это порт аналогичного проекта для Java. Вот пример использования:
var scorer = new QueryScorer(queryObject);
var highlighter = new Highlighter(scorer);
highlighter.SetTextFragmenter(new SimpleFragmenter(300));
var highlitedFragment = highlighter.GetBestFragment(
analyzer, field, textToHighlight);
Объект Highlighter
осуществляет анализ текста на основе запроса и возвращает фрагменты, содержащие наибольшее число вхождений ключевых слов.
По умолчанию все вхождения оборачиваются тегами <b></b>
. Это поведение можно изменить, указав объект Formatter
:
// ...
var highlighter = new Highlighter(
new SimpleHTMLFormatter("<SPAN class='selected'>", "</SPAN>"), scorer);
Размер возвращаемых фрагментов можно менять в объекте Fragmenter:
highlighter.SetTextFragmenter(new SimpleFragmenter(300));
Перейти к вопросу →
В MSDN описано понятие Version Tolerant Serialization (VTS), которое обозначает сериализацию, «терипимую» к изменению версии.
Version Tolerant Serialization — это набор фич, включенных в .NET Framework 2.0, которые облегчают внесение изменений в сериализуемые классы. VTS доступно для классов, помеченных атрибутом
SerializableAttribute
. Благодаря VTS можно добавлять новые поля к классам без нарушения совместимости с сериализованными данными предыдущих версий. Фичи VTS работают когда используетсяBinaryFormatter
и частично работают дляSoapFormatter
.
В частности VTS позволяет добавить свойства в класс и при этом:
- старые версии приложения смогут работать с новой версией сериализованного класса, игнорируя неизвестное поле (Tolerance of Extraneous or Unexpected Data).
- новые версии приложения смогут десериализовать старые классы, задавая пропущенным свойствам значения по умолчанию (Tolerance of Missing Data).
Пункт 1 работает из коробки, а вот для пункта 2 нужно пометить соответствующее поле атрибутом OptionalFieldAttribute
:
[Serializable]
public class Customer
{
public string FirstName;
public string LastName;
[OptionalField]
public string Country;
}
Атрибут OptionalFieldAttribute
имеет свойство VersionAdded
, которое хранит порядковый номер версии файла (начиная с 2). Каждый раз при добавлении нового свойства в класс нужно помечать это поле атрибутом OptionalFieldAttribute
и указывать версию изменения.
Если при десериализации не удается найти значение какого-то из свойств/полей, то этому свойству/полю присваивается значение по умолчанию. Чтобы изменить такое поведение нужно использовать специальные атрибуты, позволяющие реагировать на события (де)сериализации:
- OnDeserializingAttribute — отмечается метод, который будет вызван перед десериализацией;
- OnDeserializedAttribute — отмечается метод, который будет вызван после десериализацией;
- OnSerializingAttribute — отмечается метод, который будет вызван перед сериализацией;
- OnSerializedAttribute — отмечается метод, который будет вызван после сериализацией;
Пример использования:
[Serializable]
public class Customer
{
public string FirstName;
public string LastName;
[OptionalField]
public string Country;
[OnDeserializing]
private void ResetCountry (StreamingContext sc)
{
Country = "Россия";
}
}
У описанного подхода есть серьезные недостатки: во-первых, он работает только с бинарной сериализацией (поправьте если тут я ошибаюсь), и во-вторых, если сериализуется сложный граф объектов, структура которого меняется от версии к версии, то средств VTS становится явно недостаточно.