package remote; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.zip.CRC32; public class SerializeB { private static byte[] storedBytes; public static void main(String[] args) { run(); } public static void run() { // new Serialize().run1(); new SerializeB().run2(); } public void writePerson() { PersonB p = new PersonB("Wilf","Smith"); storedBytes = write(p); System.out.println("Person stored ok"); } public PersonB readPerson() { PersonB person = (PersonB)read(storedBytes); if (!person.toString().equals("Wilf Smith")) { throw new IllegalStateException("Expected 'Wilf Smith' but was '"+person.toString()+"'"); } System.out.println("Person read ok"); return person; } public void printSecret() throws Exception { PersonB p = readPerson(); Field f = p.getClass().getDeclaredField("newSecretField"); f.setAccessible(true); Object value = f.get(p); System.out.println(value); } public void printInitials() throws Exception { PersonB person = readPerson(); Method m = person.getClass().getDeclaredMethod("getInitials"); m.setAccessible(true); String value = (String)m.invoke(person); System.out.println(value); } public void run1() { String s = "abc"; byte[] bs = write(s); String s2 = (String)read(bs); check(s,s2); } public void run2() { PersonB p = new PersonB("Wilf","Smith"); byte[] bs = write(p); dumpinfo(bs); PersonB p2 = (PersonB)read(bs); check(p,p2); } private void dumpinfo(byte[] bytes) { CRC32 crc = new CRC32(); crc.update(bytes,0,bytes.length); System.out.println("byteinfo:len="+bytes.length+":crc="+Long.toHexString(crc.getValue())); } public static void check(Object before, Object after) { if (before==null && after!=null) { throw new IllegalStateException("Missing deserialized object for comparison"); } if (!before.toString().equals(after.toString())) { IllegalStateException ise = new IllegalStateException("Not the same "+before+" and "+after); ise.printStackTrace(); throw ise; } System.out.println("check ok"); } public static byte[] write(Object o) { try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(o); oos.close(); baos.flush(); return baos.toByteArray(); } catch (Exception e) { return null; } } public static Object read(byte[] bs) { try { ByteArrayInputStream bais = new ByteArrayInputStream(bs); ObjectInputStream ois = new ObjectInputStream(bais); Object o = ois.readObject(); return o; } catch (Exception e) { return null; } } }