2015-06-20 18 views
12

Gần đây trong một cuộc phỏng vấn tôi đã hỏi một câu hỏi:Làm thế nào để serialize chỉ một số rất ít tài sản trong một lớp Java

Có 100 bất động sản tại một lớp Java và tôi sẽ có thể serialize chỉ 2 của tính chất. Sao có thể như thế được?

Đánh dấu tất cả 98 thuộc tính không phải là câu trả lời vì nó không hiệu quả. Câu trả lời của tôi là phân tích những đặc tính đó thành một lớp riêng biệt và làm cho nó có thể tuần tự hóa được.

Nhưng tôi được thông báo rằng, tôi sẽ không được phép sửa đổi cấu trúc của lớp học. Vâng, tôi đã cố gắng tìm một câu trả lời trong các diễn đàn trực tuyến, nhưng vô ích.

+1

Tôi chỉ muốn chỉ ra rằng việc tuần tự hóa không thực sự là một điều trong kinh nghiệm của tôi trong sản xuất Java. Có nhiều cách nhanh hơn, đẹp hơn để tạo ra đầu vào tương tác tốt với các ngôn ngữ khác và nhỏ hơn trong kích thước kết quả trong Java. (Không phải đề cập đến toàn bộ điều conflating nơi các đối tượng phải được nhận thức của đại diện lưu trữ của họ). –

Trả lời

2

Bạn có thể ghi đè lên các hành vi serialization mà không sử dụng giao diện Externalizable,

bạn cần phải thêm các phương pháp sau đây và thực hiện cần thiết ở đó,

private void writeObject(ObjectOutputStream out) throws IOException; 

private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException; 

ví dụ lớp có thể trông như thế này,

class Foo{ 
    private int property1; 
    private int property2; 
    .... 
    private int property100; 

    private void writeObject(ObjectOutputStream out) throws IOException 
    { 
    out.writeInt(property67); 
    out.writeInt(property76); 
    } 

    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException 
    { 
    property67 = in.readInt(); 
    property76 = in.readInt(); 
    } 
} 

Tham khảo this để biết thêm chi tiết

12

Nếu đó là khoảng vài trường thì bạn luôn có thể đánh dấu chúng là transient. Nhưng nếu bạn cần logic kiểm soát nhiều hơn trong searilization của bạn sau đó Externalizable là câu trả lời. Bạn có thể ghi đè quá trình serialization và deserilization bằng cách thực hiện các phương thức writeExternalreadExternal phương thức của giao diện Externalizable.

Đây là mã nhỏ để hiển thị như thế nào bạn có thể serialize chỉ vài lĩnh vực

public class Person implements Externalizable { 

    String name; 
    int age; 

    public Person() { } 

    Person(String name, int age) { 
    this.name = name; 
    this.age = age; 
    } 


    public void writeExternal(ObjectOutput out) throws IOException { 
    out.writeObject(name); 
    //out.writeInt(age); // don't write age 
    } 

    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { 
    name = (String) in.readObject(); // read only name and not age 
    } 
} 
+1

"Nhưng tôi đã nói rằng, tôi sẽ không được thực hiện lớp học." – EJP

8

Câu trả lời là thoáng từ khóa của java. nếu bạn tạo thuộc tính của một lớp tạm thời, nó sẽ không được tuần tự hóa hoặc được loại bỏ. Ví dụ:

private transient String nonSerializeName; 
Các vấn đề liên quan