Определить разрешенные символы и заблокировать все остальное, т. Е .:
// only lowercase letters and digits
if(Regex.IsMatch(yourString, @"^[a-z0-9]*$"))
{
// allowed
}
Но я думаю, что ваша проблема может лежать где-то еще, потому что вы говорите, что это происходит от сериализации (допустимой) строки, а затем десериализации (недействительной) строки. Возможно, вы используете сериализацию по умолчанию и не применяете правильную реализацию ISerializable
для ваших классов (или правильное использование атрибутов Serializable
), что приводит к сериализации свойств или полей, которые вы не хотите использовать. сериализованная.
PS: другие упоминали о проблемах кодирования, что является возможной причиной и может означать, что вы вообще не можете прочитать данные. В отношении кодирования есть одно простое правило: везде используйте одну и ту же кодировку (потоки, база данных, xml) и указывайте . Если нет, используется кодировка по умолчанию, которая может отличаться в зависимости от системы.
Редактировать: возможное решение
Исходя из новой информации (см. Ветку под оригинальным вопросом), совершенно очевидно, что проблема связана с кодированием. В OP упоминается, что он появляется с черточками, которые часто заменяются симпатичными черточками, такими как "-" (—
), когда используются в какой-то необычной среде редактирования. Поскольку кажется, что существует некоторая неясность в том, как заставить SQL Server принимать правильно закодированные строки, вы также можете решить эту проблему в своем XML.
Когда вы создаете свой XML, просто измените кодировку на максимально возможную (US-ASCII
). Это автоматически заставит создателя XML использовать правильные числовые объекты. Когда вы десериализуете, это будет правильно проанализировано в ваших строках без лишних слов. Что-то вроде этого:
Stream stream = new MemoryStream();
XmlWriterSettings settings = new XmlWriterSettings();
settings.Encoding = Encoding.ASCII;
XmlWriter writer = XmlWriter.Create(stream, settings);
// make sure to output the xml-prolog header
Но помните об использовании StringBuilder
или StringWriter
, потому что он установлен на использование UTF-16, и XmlWriter всегда будет писать в этой кодировке, больше информации об этой проблеме в моем блоге, который не совместим с SQL Server.
Примечание: при использовании кодировки ASCII будет закодирован любой символ выше 0x7F
. Итак, é будет выглядеть как é
, а тире может выглядеть как —
, но это означает то же самое, и вам не следует об этом беспокоиться. Каждый инструмент с поддержкой XML будет правильно интерпретировать этот ввод.
Примечание 2: место, где вы хотите изменить способ написания XML, - это веб-служба, о которой вы говорите, которая получает XML и затем сохраняет его в базе данных SQL Server. Перед сохранением в SQL Server, изменения должны быть применены. Раньше в цепочке бесполезно.