2017-01-25 4 views
-1
string longMessage = "";//The string to convert to bytes 
for (int i = 0; i < 999; i++)//Adding 999 chars 
{ 
    longMessage += "i"; 
} 
byte[] buffer = new byte[1024];//Array of bytes to store the message 
Stream stream = new MemoryStream(buffer); 
BinaryFormatter formatter = new BinaryFormatter(); 
formatter.Serialize(stream, longMessage); 

文字列に999個以上の文字を入れても、1024文字以降ではなくエラーが発生するのはなぜですか?C#:なぜ999文字だけを1,024バイトに変換できますか?

NotSupportedException: Cannot expand this MemoryStream

ERROR::それは実際の型は、それがバックデシリアライズすべきか、ということを知っていないだろう、この種の情報がなければ、私は次のエラーを取得します。

+2

あなたは私たちに実際のエラー情報を与えることを忘れていましたか?私は何が起こっているのか分かりません。 –

+0

@ rory.ap NotSupportedException:このMemoryStreamを展開できません – Aviv

+1

この情報を含めるには実際の質問を編集してください。私はあなたがなぜそれを含めなかったのかわかりません... –

答えて

1

文字列自体にはエンコーディングを持っている - それは1つのバイト文字の配列だけではありません。その文字列とその読み方(ASCII、Unicode、UTFなど)に関する追加情報が含まれています。

あなたが使用することができ、入力文字列から1024バイト配列を取得するためにASCIIエンコードを使用するには、次

string longMessage = "";//The string to convert to bytes 
for (int i = 0; i < 1024; i++)//Adding 1024 chars 
{ 
    longMessage += "i"; 
} 
byte[] buffer = Encoding.ASCII.GetBytes(longMessage); 
+0

私が使ったエンコーディングはUnicodeですか? – Aviv

+0

@Avivはい、UTF-16は、.NET、Java、JavaScript、XML、HTMLなどのすべての文字列と同様です。主に西洋スクリプトを含むテキストをよりコンパクトにしたい場合は、(Easternスクリプトのテキストスペースを増やすという代償を払って) 'buffer = Encoding.UTF8.GetBytes(longMessage)'を使用してください。静かなデータ損失が必要な場合は、ASCIIを使用してください。いずれにしても、直列化および逆シリアル化ルーチンは同じエンコーディングを使用する必要があります。 –

1

BinaryFormatterは、実際のデータに加えてタイプ情報を出力するためです。これは、文字列を格納していることを示す追加のバイトがあることを意味します。使用している.NETフレームワークのバージョンでは(BinaryFormatterは移植性がないため)、この型情報は明らかに25バイトを占めています。

このタイプの情報がないと、実際のタイプに戻して逆シリアル化する必要があることがわかりません。

だから、基本的には、バイナリシリアルのために必要なことはできるだけ多くのバイトを任せることができます:

using (MemoryStream stream = new MemoryStream()) 
{ 
    BinaryFormatter formatter = new BinaryFormatter(); 
    formatter.Serialize(stream, longMessage); 
    byte[] actualData = stream.ToArray(); 
} 
関連する問題