B
bryantd
Unregistered / Unconfirmed
GUEST, unregistred user!
如果超类没有实现Serializable接口,子类就一定要实现该接口才能实现对象串行化。而且还要保证超类里有无参数的构造方法,为什么要有这样的要求?我举一个例子,大家可以根据这个实例来讨论:
import java.io.*;
//如果超类因没有实现 Serializable 接口而不可串行化,则子类
//必须实现 Serializable 接口,且超类必须具有无参构造方法。
//假定子类对象的超类部分不需要串行化:
class Super2{
private int int_field;
//基本类型都是可串行化类型
privatedo
ubledo
uble_field;
public Super2(int i,do
uble d){
int_field=i;
do
uble_field=d;
}
// 因没有实现 Serializable 接口,必须定义无参构造方法
public Super2(){
this(0,0.0);
}
public int getInt(){
return int_field;
}
public void setInt(int i){
int_field=i;
}
publicdo
uble getDouble(){
returndo
uble_field;
}
public void setDouble(double d){
double_field=d;
}
public String toString(){
return "Super2: "+int_field+","+double_field;
}
}
class Sub2 extends Super2 implements Serializable{
private String string_field;
//String 是可串行化字类型
public Sub2(int i,do
uble d, String s){
super(i,d);
string_field=s;
}
public String getString(){
return string_field;
}
public void setString(String s){
string_field=s;
}
//因为超类和子类的要进行串行化的变量都定已成为了private访问权限,因此必须在“写入”操作时调用get()函数来获得他们的值
private void writeObject(ObjectOutputStream out)throws IOException{
//通过超类提供的访问其成员变量的方法(get()方法),将超类的成员变量写入
out.writeInt(getInt());
//getInt()方法是超类提供的
out.writeDouble(getDouble());
//getDouble()方法是超类提供的
out.writeUTF(getString());
}
//因为超类和子类的要进行串行化的变量都定已成为了private访问权限,因此必须在“读出”操作时调用set()函数来改变他们的值
private void readObject(ObjectInputStream in)throws IOException{
//通过超类提供的设置其成员变量的方法(set()方法),将其超类的成员读出,实际上是设置成员变量的值
setInt(in.readInt());
//setInt()方法是超类提供的
setDouble(in.readDouble());
//setDouble()方法是子类提供的
setString(in.readUTF());
}
public String toString(){
return "Sub2: "+string_field+"
+ "+super.toString();
}
}
class stest2{
public static void main(String[] args){
Super2 sub=new Sub2(5,7.3,"Hello!"
System.out.println(sub);
try{
ByteArrayOutputStream ba=new ByteArrayOutputStream(500);
ObjectOutputStream out=new ObjectOutputStream(ba);
out.writeObject(sub);
sub=null;
ObjectInputStream in=new ObjectInputStream(new ByteArrayInputStream(ba.toByteArray()));
sub=(Sub2)in.readObject();
}catch(Exception e){
System.err.println("Error found: "+e);
System.exit(1);
}
System.out.println(sub);
}
}
import java.io.*;
//如果超类因没有实现 Serializable 接口而不可串行化,则子类
//必须实现 Serializable 接口,且超类必须具有无参构造方法。
//假定子类对象的超类部分不需要串行化:
class Super2{
private int int_field;
//基本类型都是可串行化类型
privatedo
ubledo
uble_field;
public Super2(int i,do
uble d){
int_field=i;
do
uble_field=d;
}
// 因没有实现 Serializable 接口,必须定义无参构造方法
public Super2(){
this(0,0.0);
}
public int getInt(){
return int_field;
}
public void setInt(int i){
int_field=i;
}
publicdo
uble getDouble(){
returndo
uble_field;
}
public void setDouble(double d){
double_field=d;
}
public String toString(){
return "Super2: "+int_field+","+double_field;
}
}
class Sub2 extends Super2 implements Serializable{
private String string_field;
//String 是可串行化字类型
public Sub2(int i,do
uble d, String s){
super(i,d);
string_field=s;
}
public String getString(){
return string_field;
}
public void setString(String s){
string_field=s;
}
//因为超类和子类的要进行串行化的变量都定已成为了private访问权限,因此必须在“写入”操作时调用get()函数来获得他们的值
private void writeObject(ObjectOutputStream out)throws IOException{
//通过超类提供的访问其成员变量的方法(get()方法),将超类的成员变量写入
out.writeInt(getInt());
//getInt()方法是超类提供的
out.writeDouble(getDouble());
//getDouble()方法是超类提供的
out.writeUTF(getString());
}
//因为超类和子类的要进行串行化的变量都定已成为了private访问权限,因此必须在“读出”操作时调用set()函数来改变他们的值
private void readObject(ObjectInputStream in)throws IOException{
//通过超类提供的设置其成员变量的方法(set()方法),将其超类的成员读出,实际上是设置成员变量的值
setInt(in.readInt());
//setInt()方法是超类提供的
setDouble(in.readDouble());
//setDouble()方法是子类提供的
setString(in.readUTF());
}
public String toString(){
return "Sub2: "+string_field+"
+ "+super.toString();
}
}
class stest2{
public static void main(String[] args){
Super2 sub=new Sub2(5,7.3,"Hello!"
System.out.println(sub);
try{
ByteArrayOutputStream ba=new ByteArrayOutputStream(500);
ObjectOutputStream out=new ObjectOutputStream(ba);
out.writeObject(sub);
sub=null;
ObjectInputStream in=new ObjectInputStream(new ByteArrayInputStream(ba.toByteArray()));
sub=(Sub2)in.readObject();
}catch(Exception e){
System.err.println("Error found: "+e);
System.exit(1);
}
System.out.println(sub);
}
}