2010-10-20 2 views
6

Desidero inviare un java.nio.ByteBuffer su una rete utilizzando RMI, tuttavia ByteBuffer non è serializzabile. Ho provato la seguente classe personalizzata senza alcun risultato:Come serializzare ByteBuffer

public class NetByteBuffer implements java.io.Serializable { 

ByteBuffer buffer; 

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

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

}

Il cliente ottiene ancora un'eccezione non serialzable. Qualche idea?

Grazie

risposta

6

Non è possibile. È preferibile ottenere lo byte[] e inviarlo invece e ricostruire il ByteBuffer dall'altra parte. Ovviamente stai perdendo i vantaggi di essere un buffer.

+0

Quali vantaggi starei perdendo? Si tratta di un file PDF da Filechannel.map – jtnire

+2

Se si utilizza 'ByteBuffer' senza un motivo specifico, forse si è sicuri di utilizzare l'array di byte;) – Bozho

1

Probabilmente devi dire di più sul perché stai serializzando un buffer di byte. Se stai semplicemente cercando di inviare un mucchio di byte attraverso la rete, la risposta di @ Bozho ti ha coperto.

Se in realtà si desidera inviare uno ByteBuffer incluso il suo contenuto e lo stato, è probabilmente necessario ripensare il progetto o almeno spiegarlo qui in modo che altri possano fornire più indicazioni.

0

Long way ma il vostro obiettivo può essere realizzare:

u può creare un oggetto remoto con istanza del tipo di variabile "ByteBuffer" e definito il getter e setter metodi remoti per accedere a quella variabile.

3

Come altri ha detto ByteBuffer è un involucro di un buffer di byte quindi se avete bisogno di serializzare la classe è meglio cambiare a byte [] e utilizzare ByteBuffer nelle classi che stanno leggendo/scrittura dei dati in questo fagiolo.

Tuttavia, se è necessario serializzare una proprietà ByteBuffer (ad esempio, utilizzare un BLOB Cassandra) è sempre possibile implementare una serializzazione personalizzata (controllare questo URL http://www.oracle.com/technetwork/articles/java/javaserial-1536170.html).

I punti principali sono:

  1. marchio ByteBuffer come transitoria (quindi non è serializzati per impostazione predefinita)
  2. implementare la propria lettura/scrittura per la serializzazione in cui ByteBuffer -> byte [] durante la serializzazione e di byte [] -> ByteBuffer sulla deserializzazione.

Prova questa classe e fatemi sapere se questo funziona per voi:

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; 
    } 

}