7

BinaryFormatterをテストして、どのように機能するかを確認しています。簡単な質問があります。

文字列HELLOで使用し、MemoryStreamを配列に変換すると、29の次元が得られ、そのうちの5つが次元の終わりに向かって実際のデータになります。

            BinaryFormatter bf = new BinaryFormatter();

            MemoryStream ms = new MemoryStream();

            byte[] bytes;
            string originalData = "HELLO";

            bf.Serialize(ms, originalData);
            ms.Seek(0, 0);

            bytes = ms.ToArray();

戻り値

-       bytes   {Dimensions:[29]}   byte[]
        [0] 0   byte
        [1] 1   byte
        [2] 0   byte
        [3] 0   byte
        [4] 0   byte
        [5] 255 byte
        [6] 255 byte
        [7] 255 byte
        [8] 255 byte
        [9] 1   byte
        [10]    0   byte
        [11]    0   byte
        [12]    0   byte
        [13]    0   byte
        [14]    0   byte
        [15]    0   byte
        [16]    0   byte
        [17]    6   byte
        [18]    1   byte
        [19]    0   byte
        [20]    0   byte
        [21]    0   byte
        [22]    5   byte
        [23]    72  byte
        [24]    69  byte
        [25]    76  byte
        [26]    76  byte
        [27]    79  byte
        [28]    11  byte

すべての無関係な情報なしでバイトとしてエンコードされたデータのみを返す方法はありますか?

4

5 に答える 5

6

その無関係な情報はすべて、他のBinaryFormatter(オブジェクトを逆シリアル化する)に、どのタイプのオブジェクトが逆シリアル化されているか(この場合はSystem.String)を通知します。タイプに応じて、オブジェクトを再構築するために必要な他の情報が含まれます(たとえば、オブジェクトがである場合はStringBuilderCapacityそこにもエンコードされます。

MemoryStream文字列をバッファに詰め込むだけの場合は、次のようにします。

        using (MemoryStream ms = new MemoryStream())
        using (TextWriter writer = new StreamWriter(ms))
        {
            writer.Write("HELLO");
            writer.Flush();

            byte[] bytes = ms.ToArray();
        }
于 2010-06-01T20:53:24.663 に答える
2

単純な文字列の場合は、BinaryWriterを使用します。オーバーヘッドは小さな長さのプレフィックスに削減されます。

BinaryFormatterは、(複雑な)オブジェクトクラスターのシリアル化を目的としており、そのためにいくつかの補助データ構造が必要です。

于 2010-06-01T20:47:09.597 に答える
2

それはあなたが実際に何を望んでいるかによります。Encoding.UTF8.GetBytesを使用して、文字列からUTF8バイト配列を取得できます。

于 2010-06-01T20:47:28.703 に答える
2

その「余分な」情報をすべて取り除いてはいけません。シリアル化されたデータからオブジェクトを再構成する場合、デシリアライザーはもう一方の端でそれを必要とします。

于 2010-06-01T20:48:00.440 に答える
2

文字列をバイト配列に変換しようとしていますか?それがあなたの目標である場合、あなたはもっと次のようなことをすることができます:

byte[] bits = System.Text.Encoding.UTF8.GetBytes("HELLO");
于 2010-06-01T20:48:58.207 に答える