Используйте ДОБИРАЮТСЯ или POST для поисковой формы

Второй не может быть сериализован (исключение NotSerializableException).

Это будет потому, что вы инициализируете свою карту нестатическим методом внутри несериализуемого класса.

Инициализация в двойных скобках - это просто определение анонимного класса с помощью инициализатора экземпляра. Анонимные классы в нестатических контекстах фиксируют ссылку на включающий экземпляр.

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

Самое простое решение, честно говоря, просто избежать двойной инициализации. Это синтаксическая выдумка, которая слишком умна для своего блага.

Однако, если вы действительно настаиваете на его использовании, вы можете просто выполнить инициализацию статическим методом.

static Map<String, Object> doubleBrace() {
  return new HashMap<String, Object>(){
    private static final long serialVersionUID = 1L;
    {
      put("test", "String");
    }};
}

Но это несколько противоречит краткости использования инициализации двойной скобки в первую очередь.

29
задан Darryl Hein 18 November 2008 в 07:21
поделиться

2 ответа

Используйте сообщение и если пользователь отмечает поиск, сохраните его в базе данных и дайте ему уникальный маркер, то перенаправьте к использованию страницы результатов поиска GET и передача маркера как параметр.

TinyURL является хорошим примером: Вы даете ему очень длинный URL, это сохраняет его к DB, дает Вам уникальный идентификатор для того URL, и позже можно запросить длинный URL с помощью того идентификатора.

В PHP это было бы что-то вроде:

<?php
if (isset($_GET['token']))
{
    $token = addslashes($_GET['token']);
    $qry = mysql_query("SELECT fields FROM searches WHERE token = '{$token}'");
    if ($row = mysql_fetch_assoc($qry))
    {
        performSearch(unserialize($row['fields']));
        exit;
    }
    showError('Your saved search has been removed because it hasn\'t been used in a while');
    exit;
}
$fields = addslashes(serialize($_POST));
$token = sha1($_SERVER['REMOTE_ADDR'].rand());
mysql_query("INSERT INTO searches (token, fields, save_time) Values ('{$token}', '{$fields}', NOW())");
header('Location: ?token='.$token);
exit;
?>

И выполненный сценарий ежедневно:

<?php
mysql_query('DELETE FROM searches WHERE save_time < DATE_ADD(NOW(), INTERVAL -200 DAY)');
?>
1
ответ дан 28 November 2019 в 02:08
поделиться

Вот четыре возможных решения.

1) Используйте CodeDOM для создания кода C # или VB. Это также позволит использовать расширения Visual Studio для создания кода в файлах дизайнера. Подобно некоторым встроенным инструментам, которые уже предлагает визуальная студия - как те, которые генерируют обертки для вызовов веб-сервиса и т.д. К сожалению, я мало знаю о расширении Visual Studio.

  • Достоинства - источник можно создать до создания. Это упрощает написание кода для сгенерированных типов из любой сборки.
  • Недостатки - не язык агностический. Вы застряли с поддерживаемыми языками.

2) Используйте библиотеку Mono.Cecil для анализа сборки после сборки. Затем можно повторно записать сборку с включенными новыми типами.

  • Достоинства - Язык агностик.
  • Недостатки - при добавлении типов в ту же сборку, в которой определены структуры, вы не сможете записать код для созданных неизменяемых типов структур в той же сборке. Если созданные типы помещены в новую сборку, это возможно.

3) Используйте PostSharp . Я не так много знаю об этой библиотеке, поэтому вы, возможно, не сможете добавить новые типы в вашу сборку, но я знаю, что вы можете вводить IL в методы. Он также имеет много хороших вещей, что позволяет легко сделать это с атрибутами. Так что вы могли бы сделать это -

[GenerateImmutable]
struct Foo
{
    public int apples;
    public int oranges;
    public Foo Clone() {return (Foo) base.MemberwiseClone();}
}
  • Достоинства - Язык агностик, AOP проще сделать в PostSharp.
  • Недостатки - то же самое, что и с Mono.Cecil, а также не уверен, что вы можете создать новые типы с помощью PostSharp.

4) Используйте встроенные библиотеки Reflection.Emit для создания новой сборки с неизменяемыми типами.

  • Достоинства - Язык агностик, никаких сторонних материалов.
  • Недостатки - необходимо поместить созданные типы в новые сборки. Невозможно добавить их в ту же сборку, в которой находится исходный тип.
-121--2863473-

, если вы считаете, что

 #ifdef NDEBUG
  // nondebug
 #else
  // debug code
 #endif

является наиболее портативным.

Но компилятор не знает, идет ли компиляция отладки или выпуска, поэтому это не автоматически. Но этот используется assert.h в c-runtime, так что это довольно часто. Visual Studio установит его, и я уверен, что большинство других IDE тоже захотят.

-121--2344650-

Можно философски смотреть на отправку поиска POST как на создание сохраненного поиска (особенно когда поиск является таким же сложным объектом, как и ваш пользователь). В этом случае можно принять сообщение для создания поиска, а затем перенаправить с помощью GET для получения соответствующих результатов поиска (post/redirect/get).

Это также позволит пользователям закладывать результаты поиска (GET) для возврата в любое время для повторного выполнения поиска.

0
ответ дан 28 November 2019 в 02:08
поделиться
Другие вопросы по тегам:

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