Как сериализовать ByteBuffer - PullRequest
       9

Как сериализовать ByteBuffer

6 голосов
/ 21 октября 2010

Я хочу отправить java.nio.ByteBuffer через сеть, используя RMI, однако ByteBuffer не сериализуем. Я пробовал следующий пользовательский класс безрезультатно:

public class NetByteBuffer implements java.io.Serializable {

ByteBuffer buffer;

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

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

}

Клиент по-прежнему получает не сериализуемое исключение. Есть идеи?

Спасибо

Ответы [ 4 ]

6 голосов
/ 21 октября 2010

Вы не можете. Вам лучше получить byte[] и отправить его взамен и восстановить ByteBuffer на другой стороне. Вы, конечно, теряете преимущества, будучи буфером.

4 голосов
/ 04 ноября 2015

Как и другие говорили, что ByteBuffer - это обертка буфера байтов, поэтому, если вам нужно сериализовать ваш класс, лучше перейти на byte [] и использовать ByteBuffer в классах, которые читают / записывают данные в этот бин.

Но если вам нужно сериализовать свойство ByteBuffer (например, использовать блобы Cassandra), вы всегда можете реализовать пользовательскую сериализацию (проверьте этот 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;
    }

}
1 голос
/ 21 октября 2010

Возможно, вам нужно больше рассказать о том, почему вы сериализуете байтовый буфер.Если вы просто пытаетесь отправить несколько байтов по сети, ответ @ Bozho поможет вам.

Если вы действительно хотите отправить через ByteBuffer, включая его содержимое и состояние, вам, вероятно, понадобитсяпереосмыслить свой дизайн или хотя бы объяснить его здесь, чтобы другие могли дать больше указаний.

0 голосов
/ 21 октября 2010

Долгий путь, но ваша цель может быть достигнута:

Вы можете создать удаленный объект с типом переменной экземпляра «ByteBuffer» и определить удаленные методы получения и установки для доступа к этой переменной.

...