0

みんな!Java でのシリアライゼーションに関する古い記事を探しています。オブジェクトを ByteArray に変換したい。これまでのところ、私はこれを行ってきました:

public class test 
{

    public static void main(String[] args) throws IOException 
    {
        // 00111111 00111111 00111111 11110000  - in bytes: 63, 63, 63, 240
        int x = 1061109744; 
        byte[] bytes = null;

        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutput out = null;
        try {
            out = new ObjectOutputStream(bos);   
            out.writeObject(x);
            bytes = bos.toByteArray();

        } 
        finally 
        {
            out.close();
            bos.close();
        }

        System.out.println("Lenght: " + bytes.length);

        for(int i=0; i < bytes.length; i++)
        {
            System.out.println(bytes[i]);
        }
    }
}

どうやらそれはうまく機能しますが、多くの「がらくた」をByteArray. 私にとって本当に興味深い値は、「int x = 1061109744;」に対応する最後の 4 バイトです。

なぜこれが起こるのですか?

「ジャンク」値を回避することは可能ですか?

「署名された」値を超えることは可能ですか? (128 より大きいバイト値を書き込む必要があります)。

4

2 に答える 2

1

「ジャンク」値を回避することは可能ですか?

はい。intではなくを書き出しObjectます。に を渡すintと、 にwriteObject昇格 (オートボクシング) されます。つまり、シリアル化された情報には、 ではなくオブジェクトIntegerであるというヘッダー情報が含まれます。出力ストリームにバイト (int の下位 8 ビット) を書き込むメソッドがあります。それらが署名されているかどうかは、ストリーム内のビットではなく、純粋に解釈の問題です。Integer intByteArrayOutputStreamwrite(int)

于 2013-05-04T21:58:33.873 に答える
1

フィールドのシリアル化による使用DataOutputStreamとフィールド:

ByteOutputStream baos = new ByteOuputStream();
DataOutputStream dos = new DataOutputStream(baos);

dos.writeInt(x);

dos.close();
bytes = baos.toByteArray();

バイト配列では、すべての要素が (自然に) 署名されています。ただし、署名なしで印刷したい場合は、次のようにします。

for(int i=0; i < bytes.length; i++)
{
    System.out.println(0xFF & bytes[i]);
}
于 2013-05-04T23:15:48.400 に答える