接下来执行序列化操作操作,将对象写入文件:
packagefanxuliehua;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.ObjectOutputStream;importjava.lang.reflect.Constructor;importjava.lang.reflect.Field;importjava.lang.reflect.Method;public classMain {public static voidmain(String [] args)
{
Employee e= newEmployee();
e.name= "小鬼";
e.address= "成都";
e.SSN= 2333;
e.number= 110;try{
FileOutputStream fileOut=
new FileOutputStream("D:\\/employee.ser");//序列化文件路径
ObjectOutputStream out = newObjectOutputStream(fileOut);
out.writeObject(e);//序列化写入对象
out.close();
fileOut.close();
}catch(IOException i)
{
i.printStackTrace();
}
}
}
然后我们去打开这个employee.ser文件看看
aced 0005是16进制流中java序列化对象的标志,通常会在TCP流量中出现,如果是base64传输java序列化对象的标志则是rO0AB开头(aced0005经过base64编码的结果)或者是YWNlZCA开头(fastjson的POC中就可以看见这种base64编码方式),如果是字节码数据,则数据有可能是sr java.xxx.xxx 的样子。
接下来恢复这个对象:
packagefanxuliehua;importjava.io.FileInputStream;importjava.io.IOException;importjava.io.ObjectInputStream;public classMain {public static voidmain(String [] args)
{
Employee e= null;try{
FileInputStream fileIn= new FileInputStream("D:\\/employee.ser");
ObjectInputStream in= newObjectInputStream(fileIn);
e= (Employee) in.readObject();//readObject是从文件中读取对象的方法
in.close();
fileIn.close();
}catch(IOException i)
{
i.printStackTrace();return;
}catch(ClassNotFoundException c)
{
c.printStackTrace();return;
}
System.out.println("Deserialized Employee...");
System.out.println("Name: " +e.name);
System.out.println("Address: " +e.address);
System.out.println("SSN: " +e.SS