2015-06-20 6 views
12

Recentemente in un'intervista mi è stato chiesto una domanda:Come serializzare solo un paio di immobili a una classe Java

ci sono 100 immobili a una classe Java e dovrei essere in grado di serializzare solo 2 dei proprietà. Com'è possibile?

Contrassegnare tutte le 98 proprietà non è stata la risposta in quanto non è efficiente. La mia risposta è stata quella di ritagliare quelle proprietà in una classe separata e renderla serializzabile.

Ma mi è stato detto che non potrò modificare la struttura della classe. Beh, ho cercato di trovare una risposta nei forum online, ma invano.

+1

Voglio solo sottolineare che la serializzazione non è davvero una cosa nella mia esperienza nella produzione Java. Esistono modi molto più veloci e più belli per produrre input che interagiscono bene con altri linguaggi ed è più piccolo nelle dimensioni risultanti in Java. (Per non parlare dell'intera cosa conflittuale in cui gli oggetti devono essere consapevoli della loro rappresentazione di archiviazione). –

risposta

2

Si poteva ignorare il comportamento di serializzazione senza utilizzando l'interfaccia Externalizable,

è necessario aggiungere metodi descritti di seguito e fare il necessario lì,

private void writeObject(ObjectOutputStream out) throws IOException; 

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

ad esempio di classe potrebbe assomigliare a questo,

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

Vedere this per ulteriori dettagli

12

Se si tratta di pochi campi, è sempre possibile contrassegnarli come transient. Ma se hai bisogno di più logica controllata nella tua searilizzazione, allora la risposta è Externalizable. È possibile sovrascrivere il processo di serializzazione e deserilizzazione implementando i metodi writeExternal e readExternal per l'interfaccia Externalizable.

Ecco piccolo codice per mostrare come è possibile serializzare solo pochi campi

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

"Ma mi è stato detto che non mi sarà data l'implementazione della lezione." – EJP

8

La risposta è transitoria parola chiave di Java. se si crea una proprietà di un transitorio di classe non verrà serializzato o deserializzato. Per esempio:

private transient String nonSerializeName; 
Problemi correlati