2015-06-20 2 views
12

Недавно в одном из интервью я задал вопрос:Как сериализовать только очень немногие свойства в классе Java

Есть 100 свойства в классе Java, и я должен быть в состоянии сериализовать только 2 из свойства. Как это возможно?

Пометка всех 98 объектов не была ответом, поскольку она неэффективна. Мой ответ заключался в том, чтобы вырезать эти свойства в отдельный класс и сделать его сериализуемым.

Но мне сказали, что мне не разрешат изменять структуру класса. Ну, я попытался найти ответ в онлайн-форумах, но напрасно.

+1

Я просто хочу указать, что сериализация на самом деле не вещь в моем опыте в производстве Java. Существуют гораздо более быстрые и эффективные способы создания ввода, которые хорошо взаимодействуют с другими языками и меньше в результирующем размере на Java. (Не говоря уже о всей конфликтованной вещи, где объекты должны быть осведомлены о своем представлении хранилища). –

ответ

2

Вы можете переопределить поведение сериализации без используя Externalizable интерфейса,

вам необходимо добавить следующие методы и сделать потребное там,

private void writeObject(ObjectOutputStream out) throws IOException; 

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

, например, класс может выглядеть так,

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

См. this для получения более подробной информации.

12

Если информация о нескольких областях, вы всегда можете отметить их как transient. Но если вам нужна более контролируемая логика в вашей поисковой системе, тогда ответ Externalizable. Вы можете переопределить процесс сериализации и десерилизации, применяя методы writeExternal и readExternal методов интерфейса Externalizable.

Вот небольшой код, чтобы показать, как вы можете сериализовать только несколько полей

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

«Но мне сказали, что мне не предоставят реализацию класса». – EJP

8

Ответ переходная ключевое слово Java. Если вы создадите свойство переходного процесса, он не будет сериализован или десериализован. Например:

private transient String nonSerializeName; 
Смежные вопросы