package remote; import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.lang.reflect.Field; import java.util.zip.CRC32; public class Serialize { private static byte[] storedBytes; // This is a serialized Person(Wilf,Smith) private static final String serString = "aced00057372000d72656d6f74652e506572736f6e176b418850fd97d50200024c000966697273746e616d657400124c6a6176612f6c616e672f537472696e673b4c00086c6173746e616d6571007e0001787074000457696c66740005536d697468"; private static final byte[] serBytes; static { serBytes = new byte[serString.length()/2]; int p = 0; while (p < serString.length()) { String oneByte = serString.substring(p,p+2); int b = Integer.decode("0x"+oneByte); serBytes[p/2]=(byte)b; p+=2; } System.out.println(); } public static void main(String[] args) { if (args!=null && args.length!=0 && args[0].equals("ds")) { new Serialize().checkPredeserializedData(); } else { run(); new Serialize().checkPredeserializedData(); } } public void checkPredeserializedData() { Person p = (Person)read(serBytes); if (p==null) { throw new IllegalStateException("Unable to deserialize Person!"); } if (!p.toString().equals("Wilf Smith")) { throw new IllegalStateException("Unable to deserialized pre-serialized data: "+p.toString()); } System.out.println("Pre-serialized form checked ok"); } public static byte[] loadBytesFromStream(InputStream stream) { try { BufferedInputStream bis = new BufferedInputStream(stream); byte[] theData = new byte[10000000]; int dataReadSoFar = 0; byte[] buffer = new byte[1024]; int read = 0; while ((read = bis.read(buffer)) != -1) { System.arraycopy(buffer, 0, theData, dataReadSoFar, read); dataReadSoFar += read; } bis.close(); // Resize to actual data read byte[] returnData = new byte[dataReadSoFar]; System.arraycopy(theData, 0, returnData, 0, dataReadSoFar); return returnData; } catch (IOException e) { throw new RuntimeException(e); } } public static void run() { // new Serialize().run1(); new Serialize().run2(); } public void writePerson() { Person p = new Person("Wilf","Smith"); storedBytes = write(p); System.out.println("Person stored ok"); } public Person readPerson() { Person person = (Person)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 { Person p = readPerson(); Field f = p.getClass().getDeclaredField("newSecretField"); f.setAccessible(true); Object value = f.get(p); 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() { Person p = new Person("Wilf","Smith"); byte[] bs = write(p); dumpinfo(bs); Person p2 = (Person)read(bs); check(p,p2); } private void dumpinfo(byte[] bytes) { CRC32 crc = new CRC32(); crc.update(bytes,0,bytes.length); StringBuilder data = new StringBuilder(); for (int i=0;i<bytes.length;i++) { int val = bytes[i]; String s = "00"+Integer.toHexString(val); data.append(s.substring(s.length()-2)); } System.out.println("Bytedata:"+data.toString()); System.out.println("byteinfo:len="+bytes.length+":crc="+Long.toHexString(crc.getValue())); // when run directly, this will print: byteinfo:len=98:crc=c1047cf6 } 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); 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; } } // java.io.InvalidClassException: remote.Person; local class incompatible: // // stream classdesc serialVersionUID = 1687514539110537173, // local class serialVersionUID = 510407729579040532 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; } } }