0

私のプログラムでは、ユーザーが持つ可能性のあるオブジェクトのリストを保存したいと考えています。各オブジェクトには、ID や参照と同じように特定の値があります。オブジェクトの数値を ASCII 文字に変換してディスクに保存するのは良い考えだと思いました。

ここに私のオブジェクト配列があります:

public short[,] Data = new short[5,5];

乱数 (ユーザーが持つ可能性のあるオブジェクト ID を表す 42 から 100 の間) を入力し、ファイルにシリアル化する前にデータを ASCII 文字に変換します。

for (int i = 0; i <= 4; i++)
{
    for (int ii = 0; ii <= 4; ii++)
    {
        Data[i, ii] = (short)Rand.Next(42, 100); //random numbers to get random characters
        Save_Data.ASCII += (char)Data[i, ii]; //Converting to ASCII and adding to Class which will be saved to file
    }
}

XmlSerializer Writer = new XmlSerializer(typeof(Save_Data)); 

using (FileStream file = File.OpenWrite(myfile)) 
{
    Writer.Serialize(file, Save_Data);
}

ファイルを読み取るときにエラーは発生せず、データを値のリストに戻すことができます。元のデータは配列にありますが、リストを配列に戻すためのコードは含めていません

Save_Data fList; 

XmlSerializer Reader = new XmlSerializer(typeof(Save_Data)); 

using (FileStream input = File.OpenRead(myfile)) 
{
    fList = Reader.Deserialize(input) as Save_Data; //Reading in the data
}

string Final = "";

byte[] ASCII = Encoding.ASCII.GetBytes(fList.World);

foreach (Byte b in ASCII)
{
    Final += " " + b.ToString();
}

Console.WriteLine(Final);

これはうまくいきます。ただし、ランダム関数の範囲を拡張すると、次のようになります。

Rand.Next(12,100);

制御文字などの他の ASCII 文字を含めるには、ファイルをプログラムに読み込むときにエラーが発生します。

XML 文書 (x, y) にエラーがあります。

(x = 行、Y = 列)

後で例外が次のように述べられています。

"' V '、16 進値Wは無効な文字です。行X、位置 Y。 "

V = ASCII 制御文字

W = この制御文字の 16 進値

X = 行番号

Y = 位置の値

制御文字はシリアル化できませんか? もしそうなら、これを回避する方法はありますか?

2 つ目の注意点: この方法では、制御文字を使用しない場合、可能なオブジェクト ID/参照番号が 60 未満しか得られません。より多くの文字をサポートできるので、Unicode を使用した方がよいのではないかと考えました。私の現在のコードでは、ASCII で Unicode を使用する方法はありますか? 私はスタックにかなり慣れていないため、これが非常に基本的な質問である場合は、事前にお詫び申し上げます...

4

4 に答える 4

1

別の方法として、短い配列の次元に合わせたサイズのバイト配列を作成し、(byte)Data[i, ii] で埋めます。

次に、Convert.ToBase64String(byte_array) を使用すると、XML ドキュメントで安全に使用できる文字列が得られます。

逆シリアル化の場合、 Covert.FromBase64String(xml_value) を使用してバイト配列を取得し、ループして短い配列を埋めます。

于 2013-05-02T02:21:22.710 に答える
0

配列を直接シリアル化しようとしましたか?

XMLシリアライザーの仕事をしようとする理由はあまりないと思います。最悪の場合は、5x5 配列を 25 要素の 1 次元配列にフラット化することです。

于 2013-05-02T17:59:53.227 に答える
0

問題は、バイナリ データをテキスト ドキュメントに埋め込んでいることです。バイナリシリアル化ですべてを行うか、.ToString()メソッドを介して数値を文字列に変換します。

オブジェクト配列を 1 次元配列に変更する場合は、単純にstring Save_Data.ASCIIを ashort[] Save_Data.Dataに置き換えるだけXmlSerializerで、手動で何かを文字列に変換する必要なく直接シリアル化されます。それがIMOで最も簡単なことです。

WRT Unicode は、元のものと同じ問題を抱えていますが、テキストにバイナリが埋め込まれています。したがって、文字の 1 つがたとえば である場合'<'、XML はそれが新しいタグの開始であると見なし、XML はユニコードかどうかに関係なく無効になります。2 番目の段落の解決策は、シリアル化する前に int が 10 進文字列としてエンコードされるため、問題を完全に回避します。

于 2013-05-01T22:33:06.833 に答える