2010-10-20 45 views
6

Tôi muốn gửi một java.nio.ByteBuffer qua mạng bằng RMI, tuy nhiên ByteBuffer không thể tuần tự hóa được. Tôi đã thử các lớp tùy chỉnh sau để avail không có:Làm thế nào để tuần tự hóa ByteBuffer

public class NetByteBuffer implements java.io.Serializable { 

ByteBuffer buffer; 

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

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

}

Khách hàng vẫn được một ngoại lệ phi serialzable. Ý tưởng nào?

Cảm ơn

Trả lời

6

Bạn không thể. Thay vào đó, bạn nên có được byte[] và gửi thay thế và xây dựng lại ByteBuffer ở phía bên kia. Tất nhiên bạn đang mất đi những lợi thế của nó là một bộ đệm.

+0

gì lợi thế tôi sẽ mất? Đây là một tệp PDF từ Filechannel.map – jtnire

+2

Nếu bạn đang sử dụng 'ByteBuffer' mà không có lý do cụ thể, thì có lẽ bạn an toàn khi sử dụng mảng byte;) – Bozho

1

Bạn có thể cần phải nói thêm về lý do bạn sắp xếp hàng loạt bộ đệm byte. Nếu bạn chỉ đơn giản là cố gắng gửi một loạt các byte trên mạng, câu trả lời của @ Bozho đã giúp bạn được bảo vệ.

Nếu bạn thực sự muốn gửi qua ByteBuffer bao gồm nội dung và trạng thái của nó, bạn có thể cần phải suy nghĩ lại về thiết kế của mình hoặc ít nhất giải thích nó ở đây để người khác có thể cung cấp thêm hướng.

0

cách dài nhưng mục tiêu của bạn có thể được thực hiện:

u có thể tạo ra một đối tượng từ xa với ví dụ kiểu biến của "ByteBuffer" và xác định các phương thức getter và setter phương thức từ xa để truy cập biến đó.

3

Giống như những người khác nói ByteBuffer là một bộ đệm của byte vì vậy nếu bạn cần serialize lớp của bạn tốt hơn để thay đổi thành byte [] và sử dụng ByteBuffer trong các lớp đang đọc/ghi dữ liệu vào bean này.

Nhưng nếu bạn cần tuần tự hóa thuộc tính ByteBuffer (ví dụ, sử dụng các đốm màu Cassandra), bạn luôn có thể thực hiện tuần tự hóa tùy chỉnh (kiểm tra url này http://www.oracle.com/technetwork/articles/java/javaserial-1536170.html).

Những điểm chính là:

  1. dấu ByteBuffer như thoáng (vì vậy nó không đăng theo mặc định)
  2. thực hiện đọc riêng của bạn/viết cho serialization nơi ByteBuffer -> byte [] khi tuần tự và byte [] -> ByteBuffer trên deserializing.

Hãy thử lớp này và cho tôi biết nếu làm việc này cho bạn:

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

} 
Các vấn đề liên quan