1 // Example 9.1 SerializationDemo.java 2 // 3 // 4 // Copyright 2003 Bill Campbell and Ethan Bolker 5 6 import java.io.*; 7 import java.util.*; 8 9 // Test of Java serialization. 10 // 11 // %> java SerializationDemo 12 // Wrote: round blue Mon Jan 06 20:14:44 EST 2003 13 // Read: round null Mon Jan 06 20:14:44 EST 2003 14 // 15 // interesting observations: 16 // 17 // %> wc -c SerializationDemo* tmp 18 // 1207 SerializationDemo$Circle.class 19 // 1611 SerializationDemo.class 20 // 3221 SerializationDemo.java 21 // 271 tmp 22 // 23 // the "strings" command finds ascii strings in a file 24 // 25 // %> strings SerializationDemo.class | wc 26 // 45 45 813 27 // 28 // %> strings tmp 29 // SerializationDemo$Circle? 30 // attributest 31 // Ljava/util/Map;L 32 // selft 33 // LSerializationDemo$Circle;xpsr 34 // java.util.HashMap 35 // loadFactorI 36 // thresholdxp?@ 37 // datesr 38 // java.util.Datehj 39 // thisq 40 // namet 41 // roundxq 42 // 43 // %> strings tmp | wc -c 44 // 180 45 46 public class SerializationDemo 47 { 48 public static void main (String[] args) 49 { 50 Circle circle = new Circle("round"); 51 write(circle,"tmp"); 52 System.out.println("Wrote: "+ circle); 53 54 Circle circleCopy = (Circle)read("tmp"); 55 System.out.println("Read: " + circleCopy); 56 } 57 58 public static void write (Object obj, String pathname) 59 { 60 try { 61 FileOutputStream f = new FileOutputStream(pathname); 62 ObjectOutput s = new ObjectOutputStream(f); 63 s.writeObject(obj); 64 s.flush(); s.close(); f.close(); 65 } catch (Exception e) { e.printStackTrace(); } 66 } 67 68 public static Object read(String pathname) 69 { 70 try { 71 Object obj; 72 FileInputStream in = new FileInputStream(pathname); 73 ObjectInputStream s = new ObjectInputStream(in); 74 obj = s.readObject(); 75 s.close(); in.close(); 76 return(obj); 77 } 78 catch (Exception e) { 79 e.printStackTrace(); 80 } 81 return(null); 82 } 83 84 // To implement the Serializable interface you just _say_ so. 85 // You don't have to _do_ anything, although you may choose to 86 // overwrite the writeObject() and readObject() methods. 87 88 private static class Circle implements Serializable 89 { 90 private Circle self; // a circular reference 91 private Map attributes; // saved with its contents 92 93 // Don't bother saving whatever the current color 94 //(user settable) happens to be: 95 transient private String color; 96 97 Circle(String name) 98 { 99 attributes = new HashMap(); 100 attributes.put("this", this); // a circular reference 101 attributes.put("name", name); 102 attributes.put("date", new Date()); 103 this.color = "blue"; 104 self = this; 105 } 106 107 public void setColor(String color) 108 { 109 this.color = color; 110 } 111 112 // NOTE: serialization does not call toString-- it calls 113 // a smarter serialization method. 114 public String toString() 115 { 116 return( (String)attributes.get("name") + " " + 117 color + " " + (Date)attributes.get("date") ); 118 } 119 } 120 }