2009-07-31 37 views
6

Sáng nay ông chủ của tôi và tôi đã thảo luận lâu dài và cuối cùng về điều này, trong bối cảnh cố gắng chẩn đoán các vấn đề về hiệu suất với một ứng dụng web. Chúng tôi đã không thực sự đi đến bất kỳ kết luận nào.Các vấn đề với các lớp bên trong không tĩnh và tuần tự hóa trong Java

Tôi nghĩ rằng chúng ta đang nghĩ rằng các lớp bên trong không tĩnh có các vấn đề, nhưng chúng tôi không chắc chắn chính xác vấn đề là gì hoặc chính xác những gì cần tránh (chúng tôi lý luận rằng chúng tôi không thể luôn luôn tránh nó). Bất cứ ai có thể đề nghị bất kỳ hướng dẫn cho việc không gặp rắc rối với vấn đề này?

+2

Bạn thực sự cần phải làm rõ vấn đề bạn gặp phải là gì. Các lớp học được (hoặc không phải là) Serializable mỗi se chắc chắn không phải là một vấn đề - những gì quan trọng là những gì bạn đang làm với họ. Bạn có hồ sơ ứng dụng của mình không? Đâu là nơi giam giữ chính? – ChssPly76

Trả lời

7

Lớp bên trong giữ tham chiếu đến lớp ngoài của nó, do đó cố gắng tuần tự hóa bên trong cũng sẽ tuần tự hóa bên ngoài - cũng như bất kỳ đối tượng nào khác mà bên ngoài có thể giữ. Điều này có thể dẫn đến một đồ thị đối tượng rất lớn. Hoặc nó có thể thất bại, nếu bên ngoài có trạng thái không thể được tuần tự hóa (chẳng hạn như một đối tượng InputStream).

Điều đó nói rằng, có những lúc bạn phải tạo các lớp bên trong Có thể nối tiếp, ngay cả khi bạn không bao giờ có kế hoạch tuần tự hóa chúng. Ví dụ, nếu bạn đang làm việc với Swing.

Nếu bạn có kế hoạch tuần tự hóa các đối tượng này, tôi sẽ hỏi tại sao họ cần phải là lớp bên trong bất kể hiệu suất. Nói chung, bạn sẽ chỉ sắp xếp tuần tự các thùng chứa dữ liệu và các vùng chứa đó hiếm khi (nếu có) cần tham chiếu đến một số lớp "cha mẹ". Xem xét việc tạo các đối tượng lồng nhau (tĩnh) này thay vì các lớp bên trong.

3

Chỉ cần nhận thức được rằng một lớp bên trong được tuần tự hóa có một tham chiếu ngầm định đối với đối tượng chứa của nó sẽ đi một chặng đường dài. tài liệu tham khảo mà không có một số ý nghĩa:

  • Các tài liệu tham khảo được tự động tạo ra, vì vậy nó không thể là transient
  • Lớp ngoài phải serializable
  • Lớp bên ngoài sẽ được tự động đăng với nội lớp
  • các đối tượng bên ngoài không thể tách khỏi đối tượng bên trong của nó

có lẽ phương châm chính tôi có thể nạo vét lên là "không serialize bên trong lớp học cũ cept từ đối tượng chứa của họ. " Tôi không thể nghĩ ra thêm bất kỳ gotchas nào nữa.

0

Suy nghĩ. Nếu lớp bên ngoài của bạn bao gồm một bộ sưu tập (không thoáng qua) của các cá thể của lớp bên trong, thì mỗi lần bạn nối tiếp một trong các cá thể lớp bên trong, bạn sẽ thực sự kéo tất cả chúng vào tuần tự hóa.

+0

Cơ chế tuần tự hóa Java đủ thông minh để biết khi một đối tượng đã được ghi vào luồng, và các tham chiếu tiếp theo đối tượng đó sử dụng một ID. Điều này cho phép bạn xây dựng lại một biểu đồ đối tượng và giữ lại danh tính trong biểu đồ. – kdgregory

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