2009-09-26 35 views
7

Tôi chỉ mới bắt đầu với serialization Java, và tôi không rõ ràng về cách bạn có nghĩa vụ phải lấy các đối tượng từ một nguồn trong một kịch bản với không chặn I/O.Java Serializable, ObjectInputstream, không chặn I/O

Tất cả tài liệu tôi có thể tìm thấy đề xuất sử dụng ObjectInputStream là cách thích hợp để đọc trong các đối tượng được tuần tự hóa. Tuy nhiên, như tôi đã đề cập, tôi đang sử dụng java.nio và thực hiện các hoạt động không chặn. Nếu readObject() sẽ chặn cho đến khi một đối tượng mới có sẵn, điều này không thể giúp tôi

Tóm tắt .. Bạn làm serialization khi làm việc với Java NIO như thế nào?

+0

có thể bạn có thể sử dụng phương thức available() nếu luồng để thăm dò ý kiến ​​nếu có byte được đọc. – clamp

+0

typo: tất nhiên nên đọc "... của luồng .." – clamp

Trả lời

4

Bọc các phiên bản được tuần tự hóa trong giao thức báo cáo thời lượng tải trọng và trọng tải là trường hợp được đề cập. Sau đó, một khi bạn biết bạn có một phân đoạn đại diện cho một thể hiện hoàn chỉnh, bạn có thể sử dụng ObjectInputStream một cách an toàn khi biết nó sẽ không chặn.

Nghị định thư như thế này Đầu tiên 32 bit: chiều dài Payload Payload chiều dài bit: Dữ liệu In nhiều

Đôi khi tôi ngạc nhiên thậm chí bản thân mình.

+0

Bây giờ tôi biết lý do tại sao các chuỗi fortran bắt đầu bằng kích thước chuỗi sau đó là content.http: //www.ibiblio.org/pub/languages/fortran/ch2-13.html – whatnick

-1

Bạn sẽ cần triển khai (hoặc tìm cách triển khai) của một số InputStream đọc từ bộ đệm mà bạn có thể nối từ một chuỗi khác.

Có vẻ như một điều khá lạ lùng để cố gắng làm. NIO là tất cả về hiệu suất cao, và serialization là không.

+0

Tôi đang sử dụng nio vì tôi thấy giao diện dễ làm việc hơn khi xử lý một số lượng lớn luồng. Hiệu suất không phải là mối quan tâm chính. – Mike

-2

Đây là kiểu cổ điển - làm cách nào bạn có thể .read() nếu không có gì để đọc? NIO rõ ràng là hiệu suất chuyên sâu, dành riêng để đạt được io không chặn. Hãy thử làm nio trên Socket.read() - bạn vẫn sẽ nhận được hoặc là một hoạt động chặn hoặc rơi qua thời gian chờ ... không có số lượng ưa thích sẽ gây ra dữ liệu xuất hiện trên 'cổng', trừ khi bạn tạo ra một số dữ liệu ...

final SecureRandom dataGenerator = SecureRandom.getInstance("SHA1PRNG"); 

final Integer range = new Integer('z' - 'a'); 

for (big loop) 
{ 
    buffer.append(dataGenerator.nextInt (range.intValue() + (int) 'a')); 

// ............ 

do.something(buffer.toString()); 

Giờ đây, kỹ năng phát triển của bạn sẽ di chuyển, ngay cả khi ở tốc độ Glacial Pace nhưng chúng di chuyển.

try { 
    // Create a read/writeable file channel 
    File file = new File("filename"); 
    FileChannel channel = new RandomAccessFile(file, "rw").getChannel(); 

    // Create an output stream on the channel 
    OutputStream os = Channels.newOutputStream(channel); 

    // Create an inputstream on the channel 
    InputStream is = Channels.newInputStream(channel); 

    // Close the channel 
    is.close(); 
} catch (IOException e) { 
} 

nhắn chỉnh sửa: Tôi nắm bắt phản ứng quan trọng của bạn, chờ đến mười hai ngàn bạn dòng vào CORBA cố gắng để thực hiện readObjectNoData() (hữu dụng cho khởi tạo đối tượng deserialized đúng mặc dù một dòng suối nguồn "thù địch" hoặc không đầy đủ)

Mã psuedo một lần của tôi được mong đợi cung cấp một số loại luồng dữ liệu để giải mã, tải lại hoặc bất kỳ thứ gì - tôi đọc lại bài đăng của bạn; Tôi nghĩ rằng nó nói làm thế nào để đọc() không chặn io trên một đối tượng có thể không có ... mà khoan sâu vào các vấn đề được biết đến của ngoại lệ và lập kế hoạch, được dicey cố gắng để làm việc này với một người hỏi câu hỏi theo cách bạn đã diễn đạt nó, cố gắng diễn đạt lại và để người khác giải thích cho tôi điều bạn đang hỏi.

Tôi sẽ chuyển đến vị trí taco ngay tại thời điểm này.

+0

Tôi không nghĩ rằng bạn đã đọc bài đăng của tôi. Tôi đang tìm một cách để làm serialization trên một dòng không chặn. – Mike

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