Ответы пользователя Чак Норрис - CodeHelper

Чак Норрис

Чак Норрис
Карма 3384
Имя Неизвестно
Возраст Неизвестно
Сайт Неизвестно
Twitter Неизвестно
Участвует в проекте 1103 дн., 22 час., 55 мин.
Последняя активность 535 дн., 7 час., 46 мин. назад
О себе ничего не указано

Ответы

Новые Лучшие
1
...
7
8
9
10
11
12
Перейти к вопросу →

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 позволяет добавить свойства в класс и при этом:

  1. старые версии приложения смогут работать с новой версией сериализованного класса, игнорируя неизвестное поле (Tolerance of Extraneous or Unexpected Data).
  2. новые версии приложения смогут десериализовать старые классы, задавая пропущенным свойствам значения по умолчанию (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 становится явно недостаточно.


1
...
7
8
9
10
11
12
v1.7.123.556
© 2009—2010 CodeHelper FAQ | О сайте | Обратная связь | История изменений | Статьи
Creative Commons LicenseМатериалы сайта распространяются под лицензией Creative Commons Attribution-Share Alike 3.0 Unported.