Nella classe di serializzazione java Mp3player estende le implementazioni di ElectronicDevice Serializable in questo codice electronicdevice super classe non implementato serializzabile. qui anche la super classe viene serializzata. la mia comprensione è che anche la super classe viene serializzata a causa di extends.let me so che la mia comprensione è corretta o meno.Serializzazione Java per Extended Class
risposta
No. Durante il processo di serializzazione solo i campi di oggetti serializzabili vengono scritti e ripristinati.
Secondo javadocs
durante la deserializzazione, i campi di classi non serializzabili sarà inizializzato con il pubblico o protetto no-arg costruttore della classe.
Dove i campi delle sottoclassi serializzabili verranno ripristinati dallo stream.
Si prega di guardare in questo esempio
Qui ElectronicDevice
non è Serializable
, dove, come è Mp3player
Serializable
.Observe nel campo del comportamento classi rispettata nel processo di serializzazione.
import java.io.*;
class ElectronicDevice {
public int i = 0;
protected ElectronicDevice()
{
System.out.println("ed ");
}
}
class Mp3player extends ElectronicDevice implements Serializable {
int j =0;
Mp3player()
{
System.out.println("mp ");
}
}
class MiniPlayer extends Mp3player {
MiniPlayer()
{
System.out.println("mini ");
}
public static void main(String[] args) {
MiniPlayer m = new MiniPlayer();
m.i = 30;
m.j = 40;
try {
System.out.println("i value before serialization: "+m.i);//prints 30
System.out.println("i value before serialization: "+m.j);//prints 40
FileOutputStream fos = new FileOutputStream("dev.txt");
ObjectOutputStream os = new ObjectOutputStream(fos);
os.writeObject(m); os.close();
FileInputStream fis = new FileInputStream("dev.txt");
ObjectInputStream is = new ObjectInputStream(fis);
MiniPlayer m2 = (MiniPlayer) is.readObject();
is.close();
System.out.println("i value after serialization: "+m2.i);//prints o
System.out.println("j value after serialization: "+m2.j);//prints 40
System.out.println();
} catch (Exception x) {
x.printStackTrace();
System.out.print("x ");
}
}
}
Poiché la super classe non implementa i contenuti serializzabili della super classe non verranno serializzati. Solo i contenuti della sottoclasse verrebbero serializzati. Quando si deserializza, il costruttore predefinito della superclasse viene eseguito e i campi della superclasse vengono inizializzati come se si invocasse il costruttore predefinito.
L'esempio seguente illustra questo.
public class SerializationTest {
public static class Base {
private String name;
public Base() {
this.name = "johnDow";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public static class Sub extends Base implements Serializable {
private static final long serialVersionUID = 1L;
private String age;
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
public static void main(String[] args) throws Exception {
ByteArrayOutputStream byteArrayOS = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(byteArrayOS);
Sub s = new Sub();
s.setName("name");
s.setAge("10");
out.writeObject(s);
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(byteArrayOS.toByteArray()));
Sub d = (Sub) ois.readObject();
System.out.println(d.getName() + "-" + d.getAge());
}
}
Che cosa viene stampato è
johnDow-10
la mia comprensione è super classe è anche viene serializzato a causa di extends.let farmi sapere la mia comprensione è corretta o meno.
La risposta breve è NO.
In java, ogni classe è una sottoclasse di Object
. Lo stesso Object
implementa Serializable
?
Questa è la regola per la serializzazione superclasse:
Se sei una classe serializzabile, ma il vostro superclasse non è serializzabili, poi eventuali variabili di istanza si eredita da quella superclasse saranno riportati ai valori che sono stati dati durante la costruzione originale dell'oggetto . Questo perché verrà eseguito il costruttore della classe non serializzabile .
Pertanto, se si aggiungono alcune variabili d'istanza a ElectronicDevice, essere consapevoli del fatto che lo stato d' superclasse non verrà serializzato. (a meno che la superclasse implementi serializzabile)
Per consentire sottotipi di classi non serializzabili da serializzare, il sottotipo può assumersi la responsabilità di salvare e ripristinare lo stato della pubblica del supertipo, protetto, e (se accessibile) i campi del pacchetto”
di riferimento - http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html
- 1. Blocco sincronizzato Java per .class
- 2. Object [] per Class [] in Java
- 3. Serializzazione Java
- 4. serializzazione ArrayList Java
- 5. OpenSessionInView vs PersistentContext (Extended)
- 6. MySQL Extended Display
- 7. Serializzazione in java
- 8. Serializzazione Java sulla rete
- 9. Eager java class loading
- 10. java static class/variables
- 11. Suggerimenti per la serializzazione degli oggetti Java
- 12. Class Dimension per Java su Android
- 13. Metodi di serializzazione Java
- 14. Serializzazione Java dell'array multidimensionale
- 15. Serializzazione Java JSON - best practice
- 16. differenza tra java bean e java class?
- 17. Java serializzazione con protocollo Buffer
- 18. Generazione di Dynamic Class Java
- 19. Java Utility Class vs. Service
- 20. Deadlock Java in Class Loader
- 21. Java Abstract Class And Generics
- 22. Serializzazione Java con campo transitorio
- 23. serializzazione oggetti java - thread safe?
- 24. serializzazione oggetti java readObject/defaultReadObject
- 25. Java: quando aggiungere readObjectNoData() durante la serializzazione?
- 26. Java serializzazione degli oggetti e l'eredità
- 27. jenkins extended parameter plugin groovy script
- 28. La serializzazione Kryo dipende dalla versione Java?
- 29. Java Generic serializzazione/deserializzazione utilizzando Kryo
- 30. Come la serializzazione java funziona internamente?
Qual è il codice che tenta di mostrare esattamente? Cosa non capisci in quello che fa? –
Il meccanismo di serializzazione java si occupa solo delle istanze di classi che implementano 'Serializable', quindi nel tuo caso, i campi ereditati da' ElectronicDevice' (se presenti) non verranno serializzati/deserializzati per impostazione predefinita, vedere [this] (http: // stackoverflow. it/a/7663590/594406) risposta. – Katona
nel suddetto codice electronicdevice non è implementato nell'interfaccia serializzabile ma nel risultato (dopo la deserializzazione) "ed" sta arrivando anche nell'output. – rama