4

プロジェクト(クラス)のC#でシリアライゼーションとデシリアライゼーションを使用しています。それらはシリアル化され、XML ファイルに保存されます。プロジェクトをロードすると、すべてうまくいきます。

今、シリアル化されたプロジェクトを Base64 にエンコードしてから、ファイルを保存しようとしていますが、これもうまくいきます。ファイルの最初の行 (エンコード前!) は次のようになります。

<?xml version="1.0" encoding="utf-8"?>
  <Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

ファイルをデコードすると、? 行の前に追加:

?<?xml version="1.0" encoding="utf-8"?>
  <Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

エンコードに使用するコード:

byte[] toEncodeAsBytes = System.Text.ASCIIEncoding.ASCII.GetBytes(toEncode);
        string returnValue = System.Convert.ToBase64String(toEncodeAsBytes);
        return returnValue;

そして、デコードするためのコード:

byte[] encodedDataAsBytes = System.Convert.FromBase64String(encodedData);
        string returnValue = System.Text.ASCIIEncoding.ASCII.GetString(encodedDataAsBytes);
        return returnValue;

これは何ですか?どうすれば修正できますか?

4

3 に答える 3

7

ファイル自体が UTF-8 として宣言されているのに、なぜ ASCII を使用してバイナリにエンコードしているのですか? UTF-8 には ASCII で表現できない文字がたくさんあります。そもそもファイルをテキスト形式のメモリ内に置く必要さえありますか? 最初にバイナリデータとしてロードしないのはなぜですか (例: File.ReadAllBytes)?

文字列で開始する必要がある場合はEncoding.UTF-8(またはEncoding.Unicode、おそらくより大きなバイト配列になる可能性があります) を使用すると、すべてがうまくいくはずです。その余分な文字はバイト オーダー マークです。これは ASCII で表すことができないため、「?」差し替えキャラ。

于 2009-12-24T11:37:48.570 に答える
2

推測では?ASCII で表現できない文字である Byte-Order-Marker を表します。なぜ UTF-8 エンコーディングを使用しないのですか?

byte[] toEncodeAsBytes = System.Text.Encoding.UTF8.GetBytes(toEncode);
于 2009-12-24T11:40:52.440 に答える
0

エンコーディングについて心配する必要はなく、単に を使用して、それをシリアライゼーション コードにXmlWriter.Create(outPath)渡します。XmlWriterこれにより、この問題やその他の問題 (大きなオブジェクト グラフのために非常に大きな文字列をバッファリングする必要があるなど) を回避できます。XmlWriterSettingsより細かい制御のために を受け入れるオーバーロードがあります。

XmlWriterほとんどの xml コードで受け入れられます。

于 2009-12-24T11:44:27.360 に答える