Второй не может быть сериализован (исключение NotSerializableException).
blockquote>Это будет потому, что вы инициализируете свою карту нестатическим методом внутри несериализуемого класса.
Инициализация в двойных скобках - это просто определение анонимного класса с помощью инициализатора экземпляра. Анонимные классы в нестатических контекстах фиксируют ссылку на включающий экземпляр.
Если этот класс не сериализуем, вы не можете сериализовать свой экземпляр анонимного класса. Похоже, этот код находится внутри класса модульного теста; было бы очень необычно, чтобы такой класс был сериализуемым.
Самое простое решение, честно говоря, просто избежать двойной инициализации. Это синтаксическая выдумка, которая слишком умна для своего блага.
Однако, если вы действительно настаиваете на его использовании, вы можете просто выполнить инициализацию статическим методом.
static Map<String, Object> doubleBrace() { return new HashMap<String, Object>(){ private static final long serialVersionUID = 1L; { put("test", "String"); }}; }
Но это несколько противоречит краткости использования инициализации двойной скобки в первую очередь.
Используйте сообщение и если пользователь отмечает поиск, сохраните его в базе данных и дайте ему уникальный маркер, то перенаправьте к использованию страницы результатов поиска 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) Используйте 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();}
}
4) Используйте встроенные библиотеки Reflection.Emit для создания новой сборки с неизменяемыми типами.
, если вы считаете, что
#ifdef NDEBUG
// nondebug
#else
// debug code
#endif
является наиболее портативным.
Но компилятор не знает, идет ли компиляция отладки или выпуска, поэтому это не автоматически. Но этот используется assert.h в c-runtime, так что это довольно часто. Visual Studio установит его, и я уверен, что большинство других IDE тоже захотят.
-121--2344650-Можно философски смотреть на отправку поиска POST как на создание сохраненного поиска (особенно когда поиск является таким же сложным объектом, как и ваш пользователь). В этом случае можно принять сообщение для создания поиска, а затем перенаправить с помощью GET для получения соответствующих результатов поиска (post/redirect/get).
Это также позволит пользователям закладывать результаты поиска (GET) для возврата в любое время для повторного выполнения поиска.