許可される文字を定義し、他のすべてをブロックします。
// only lowercase letters and digits
if(Regex.IsMatch(yourString, @"^[a-z0-9]*$"))
{
// allowed
}
しかし、あなたの問題はどこかにあるのではないかと思います。なぜなら、それは文字列のシリアル化(有効)とその後の逆シリアル化(無効)に起因すると言うからです。ISerializable
デフォルトのシリアル化を使用していて、クラスに適切な実装を適用していない(またはSerializable
属性を適切に使用していない)ために、シリアル化されたくないプロパティまたはフィールドがシリアル化されている可能性があります。
PS:他の人はエンコーディングの問題について言及していますが、これは考えられる原因であり、データをまったく読み戻せないことを意味する場合があります。エンコーディングについては、1つの簡単なルールがあります。どこでも同じエンコーディング(ストリーム、データベース、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は常にそのエンコーディングで書き込みます。この問題の詳細については、SQLServerと互換性のないブログを参照してください。
注:ASCIIエンコードを使用する場合、より高い文字0x7F
がエンコードされます。したがって、éは次のようにé
なり、ダッシュはのよう—
になりますが、これはまったく同じことを意味し、心配する必要はありません。すべてのXML対応ツールは、この入力を適切に解釈します。
注2:XMLの記述方法を変更する場所は、XMLを受信してSQLServerデータベースに格納するWebサービスです。SQL Serverに保存する前に、変更を適用する必要があります。チェーンの初期は役に立たない。