import java.io.*;
public class Customer implements Serializable {
private int age;
public Customer(int age ){
this.age = age;
}
/*第一处注释
private void writeObject(ObjectOutputStream os)throws IOException{
os.defaultWriteObject();
System.out.println("write Object");
}
private void readObject(ObjectInputStream is)throws IOException,ClassNotFoundException{
is.defaultReadObject();
System.out.println("readObject ");
}
*/
public String toString(){
return "age="+age;
}
public static void main(String[] args)throws Exception{
Customer custormer = new Customer(24);
System.out.println("before Serializable: "+custormer);
ByteArrayOutputStream buf = new ByteArrayOutputStream();
ObjectOutputStream o = new ObjectOutputStream(buf);
o.writeObject(custormer); byte[] byteArray = buf.toByteArray();
for(int i=0;i<byteArray.length;i++){
System.out.print(byteArray[i]+"");
if((i%10==0 &&i!=0)|| i==byteArray.length-1)System.out.println();
}
//第二处注释
byteArray[byteArray.length-4]=1;
byteArray[byteArray.length-3]=-1;
byteArray[byteArray.length-2]=-1;
byteArray[byteArray.length-1]=-10;

ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(byteArray));
custormer = (Customer)in.readObject();
System.out.println("After Serializable:"+custormer);
}
}
1.上面的程序能正确运行,但加上第一处注释的内容后,运行时就会抛出Exception in thread "main" java.io.StreamCorruptedException: invalid type code: F6 异常,
2.对于第二处注释修改序列化对象的值有点不明白,为啥如上面的程序所示把最后 的四个字节设成-1 ,-1 -1 ,-10 结果就变成-10????

解决方案 »

  1.   

    第一处会抛出异常是因为你直接传入的参数是ObjectOutputStream ObjectIutputStream应当改为Object os
    因为你是在Customer 内重写了Serializable接口的writeObject 和readObject方法,所以参数的类型还应该是和Serializable的一样,
    传进来强制性转换一下就可以了,
    改过后代码
    /*
    private void writeObject(Object os)throws IOException{ 
    ((ObjectOutputStream) os).defaultWriteObject(); 
    System.out.println("write Object"); 

    private void readObject(Object is)throws IOException,ClassNotFoundException{ 
    ((ObjectInputStream) is).defaultReadObject(); 
    System.out.println("readObject "); 

    */
    第二处是他直接将序列里的值改了,好像是教你怎么将值转换成数列的,要么涉及到算法把,也不知道,,不过我觉得无关紧要,
    只要掌握其中原理,怎么实现到用时就知道了,哈哈
      

  2.   

    强烈建议看一下,,孙鑫 java无难事,视频教程,对初手提高很有帮助
      

  3.   

    不好意思啊,,刚才说的有错误的,,这句话有问题
    因为你是在Customer 内重写了Serializable接口的writeObject 和readObject方法
    不是Serializable的 而是ObjectOutputStream 和ObjectIutputStream的writeObject 和readObject方法
    可以可以看一下 JDK的api文挡呀的,看来还要回去老老实实的看书但我还一个地方不明白  JDK的api文挡也说到:在序列化和反序列化过程中需要特殊处理的类必须实现具有下列准确签名的特殊方法:
    private void readObject(java.io.ObjectInputStream stream)
         throws IOException, ClassNotFoundException;
     private void writeObject(java.io.ObjectOutputStream stream)
         throws IOException
     writeObject 方法负责写入特定类的对象状态,以便相应的 readObject 方法可以还原它。该方法本身不必与属于对象的超类或子类的状态有关。状态是通过使用 writeObject 方法或使用 DataOutput 支持的用于基本数据类型的方法将各个字段写入 ObjectOutputStream 来保存的。 序列化操作不写出没有实现 java.io.Serializable 接口的任何对象的字段。不可序列化的 Object 的子类可以是可序列化的。在此情况下,不可序列化的类必须有一个无参数构造方法,以便允许初始化其字段。在此情况下,子类负责保存和还原不可序列化的类的状态。经常出现的情况是,该类的字段是可访问的(public、package 或 protected),或者存在可用来还原状态的 get 和 set 方法。 实现 writeObject 和 readObject 方法可以阻止对象的序列化,这时抛出 NotSerializableException。ObjectOutputStream 导致发生异常并中止序列化进程。 应当传入ObjectInputStream os 和ObjectOutputStream 是没问题的呀?