6

RMI を使用してネットワーク経由で java.nio.ByteBuffer を送信したいのですが、ByteBuffer はシリアライズできません。次のカスタムクラスを試してみましたが、役に立ちませんでした:

public class NetByteBuffer implements java.io.Serializable {

ByteBuffer buffer;

public NetByteBuffer(ByteBuffer buffer) {
    this.buffer = buffer;
}

public ByteBuffer getByteBuffer() {
    return this.buffer;
}

}

クライアントは依然としてシリアル化不可能な例外を受け取ります。何か案は?

ありがとう

4

4 に答える 4

7

できません。を入手しbyte[]て代わりに送信ByteBufferし、反対側で を再構築することをお勧めします。もちろん、バッファであることの利点を失います。

于 2010-10-20T22:15:25.147 に答える
4

他の人が言ったように、ByteBuffer はバイトのバッファーのラップであるため、クラスをシリアル化する必要がある場合は、byte[] に変更し、この Bean にデータを読み書きするクラスで ByteBuffer を使用することをお勧めします。

ただし、ByteBuffer プロパティをシリアル化する必要がある場合 (たとえば、Cassandra blob を使用する場合) は、いつでもカスタムのシリアル化を実装できます (この URL http://www.oracle.com/technetwork/articles/java/javaserial-1536170.htmlを確認してください)。

主なポイントは次のとおりです。

  1. ByteBuffer を一時的なものとしてマークします (したがって、デフォルトではシリアル化されません)
  2. シリアライゼーション用に独自の読み取り/書き込みを実装します。シリアライズの場合は ByteBuffer --> byte[]、デシリアライズの場合は byte[] --> ByteBuffer です。

このクラスを試してみて、これがうまくいくかどうか教えてください:

public class NetByteBuffer implements java.io.Serializable {
    private static final long serialVersionUID = -2831273345165209113L;

    //serializable property
    String anotherProperty;

    // mark as transient so this is not serialized by default
    transient ByteBuffer data;

    public NetByteBuffer(String anotherProperty, ByteBuffer data) {
        this.data = data;
        this.anotherProperty = anotherProperty;
    }

    public ByteBuffer getData() {
        return this.data;
    }

    private void writeObject(ObjectOutputStream out) throws IOException {
        // write default properties
        out.defaultWriteObject();
        // write buffer capacity and data
        out.writeInt(data.capacity());
        out.write(data.array());

    }

    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
        //read default properties
        in.defaultReadObject();

        //read buffer data and wrap with ByteBuffer
        int bufferSize = in.readInt();
        byte[] buffer = new byte[bufferSize];
        in.read(buffer, 0, bufferSize);
        this.data = ByteBuffer.wrap(buffer, 0, bufferSize);
    }

    public String getAnotherProperty() {
        return anotherProperty;
    }

}
于 2015-11-04T11:00:29.773 に答える
1

おそらく、バイト バッファーをシリアル化する理由についてもっと説明する必要があります。単純にネットワーク経由で大量のバイトを送信しようとしている場合は、@Bozho の回答で十分です。

実際にコンテンツと状態を含めて送信したい場合はByteBuffer、おそらく設計を再考するか、少なくともここで説明して、他の人がより多くの方向性を提供できるようにする必要があります.

于 2010-10-21T00:53:59.740 に答える
-1

長い道のりですが、あなたの目標は達成できます:

「ByteBuffer」のインスタンス変数タイプでリモート オブジェクトを作成し、その変数にアクセスするための getter および setter リモート メソッドを定義できます。

于 2010-10-21T01:02:57.880 に答える