//############################################################################ // Serialization //############################################################################ // $Id$ import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.lang.System; //############################################################################ // Test classes in package "scala" object Test1 { private def arrayToString[A](arr: Array[A]): String = { List.fromArray(arr).mkString("Array[",",","]"); } private def arrayEquals[A,B](a1: Array[A], a2: Array[B]) = (a1.length == a2.length) && (Iterator.range(0, a1.length) forall { i => a1(i) == a2(i) }); val x1 = Nil; val x2 = None; val x3 = Array(1, 2, 3); val x4 = x: Int => 2 * x; try { val dataFile = java.io.File.createTempFile("test1", ".ser"); val out = new ObjectOutputStream(new FileOutputStream(dataFile)); out.writeObject(x1); out.writeObject(x2); out.writeObject(x3); out.writeObject(x4); out.close(); val in = new ObjectInputStream(new FileInputStream(dataFile)); val y1 = in.readObject().asInstanceOf[Nil.type]; val y2 = in.readObject().asInstanceOf[Option[All]]; val y3 = in.readObject().asInstanceOf[Array[Int]]; val y4 = in.readObject().asInstanceOf[Int => Int]; in.close(); System.out.println("x1 = " + x1); System.out.println("y1 = " + y1); System.out.println("x1 eq y1: " + (x1 eq y1) + " - y1 eq x1: " + (y1 eq x1)); System.out.println(); System.out.println("x2 = " + x2); System.out.println("y2 = " + y2); System.out.println("x2 eq y2: " + (x2 eq y2) + " - y2 eq x2: " + (y2 eq x2)); System.out.println(); System.out.println("x3 = " + arrayToString(x3)); System.out.println("y3 = " + arrayToString(y3)); System.out.println("arrayEquals(x3, y3): " + arrayEquals(x3, y3)); System.out.println(); System.out.println("x4 = "); System.out.println("y4 = "); System.out.println("x4(2): " + x4(2) + " - y4(2): " + y4(2)); System.out.println(); dataFile.deleteOnExit() } catch { case e: Exception => e.printStackTrace(); System.out.println("Error in Test1: " + e); } } //############################################################################ // Test classes in package "scala.collection.immutable" object Test2 { import scala.collection.immutable.BitSet; import scala.collection.immutable.ListMap; val x1 = List( Pair("buffers", 20), Pair("layers", 2), Pair("title", 3) ); val x2 = new ListMap[String, Int] .incl(Pair("buffers", 20)) .incl(Pair("layers", 2)) .incl(Pair("title", 3)); val x3 = new BitSet(4, Array(2), true); try { val dataFile = java.io.File.createTempFile("test2", ".ser"); val out = new ObjectOutputStream(new FileOutputStream(dataFile)); out.writeObject(x1); out.writeObject(x2); out.writeObject(x3); out.close(); val in = new ObjectInputStream(new FileInputStream(dataFile)); val y1 = in.readObject().asInstanceOf[List[Pair[String,Int]]]; val y2 = in.readObject().asInstanceOf[ListMap[String, Int]]; val y3 = in.readObject().asInstanceOf[BitSet]; in.close(); System.out.println("x1 = " + x1); System.out.println("y1 = " + y1); System.out.println("x1 equals y1: " + (x1 equals y1) + " - y1 equals x1: " + (y1 equals x1)); System.out.println(); System.out.println("x2 = " + x2); System.out.println("y2 = " + y2); System.out.println("x2 equals y2: " + (x2 equals y2) + " - y2 equals x2: " + (y2 equals x2)); System.out.println(); System.out.println("x3 = " + x3); System.out.println("y3 = " + y3); System.out.println("x3 equals y3: " + (x3 equals y3) + " - y3 equals x3: " + (y3 equals x3)); System.out.println(); dataFile.deleteOnExit() } catch { case e: Exception => System.out.println("Error in Test2: " + e); } } //############################################################################ // Test classes in package "scala.collection.mutable" object Test3 { import scala.collection.mutable.BitSet; import scala.collection.mutable.HashMap; val x1 = new HashMap[String, Int]; x1 ++= Test2.x1; val x2 = new BitSet(); x2.set(0); x2.set(8); x2.set(9); try { val dataFile = java.io.File.createTempFile("test3", ".ser"); val out = new ObjectOutputStream(new FileOutputStream(dataFile)); out.writeObject(x1); out.writeObject(x2); out.close(); val in = new ObjectInputStream(new FileInputStream(dataFile)); val y1 = in.readObject().asInstanceOf[HashMap[String, Int]]; val y2 = in.readObject().asInstanceOf[BitSet]; in.close(); System.out.println("x1 = " + x1); System.out.println("y1 = " + y1); System.out.println("x1 equals y1: " + (x1 equals y1) + " - y1 equals x1: " + (y1 equals x1)); System.out.println(); System.out.println("x2 = " + x2); System.out.println("y2 = " + y2); System.out.println("x2 equals y2: " + (x2 equals y2) + " - y2 equals x2: " + (y2 equals x2)); System.out.println(); dataFile.deleteOnExit() } catch { case e: Exception => System.out.println("Error in Test3: " + e); } } //############################################################################ // Test user-defined classes WITHOUT nesting class Person(_name: String) with java.io.Serializable { private var name = _name; override def toString() = name; override def equals(that: Any): Boolean = that.isInstanceOf[Person] && (name == that.asInstanceOf[Person].name); } class Employee(_name: String) with java.io.Serializable { private var name = _name; override def toString() = name; } object bob extends Employee("Bob"); object Test4 { val x1 = new Person("Tim"); val x2 = bob; try { val dataFile = java.io.File.createTempFile("test4", ".ser"); val out = new ObjectOutputStream(new FileOutputStream(dataFile)); out.writeObject(x1); out.writeObject(x2); out.close(); val in = new ObjectInputStream(new FileInputStream(dataFile)); val y1 = in.readObject().asInstanceOf[Person]; val y2 = in.readObject().asInstanceOf[Employee]; in.close(); System.out.println("x1 = " + x1); System.out.println("y1 = " + y1); System.out.println("x1 equals y1: " + (x1 equals y1) + " - y1 equals x1: " + (y1 equals x1)); System.out.println(); System.out.println("x2 = " + x2); System.out.println("y2 = " + y2); System.out.println("x2 equals y2: " + (x2 equals y2) + " - y2 equals x2: " + (y2 equals x2)); System.out.println(); dataFile.deleteOnExit() } catch { case e: Exception => System.out.println("Error in Test4: " + e); } } //############################################################################ // Test user-defined classes WITH nesting object Test5 with java.io.Serializable { object bill extends Employee("Bill") { val x = paul; } object paul extends Person("Paul") { val x = 4; // bill; => StackOverflowException !!! } val x1 = new Person("John"); val x2 = bill; val x3 = paul; try { val dataFile = java.io.File.createTempFile("test5", ".ser"); val out = new ObjectOutputStream(new FileOutputStream(dataFile)); out.writeObject(x1); out.writeObject(x2); out.writeObject(x3); out.close(); val in = new ObjectInputStream(new FileInputStream(dataFile)); val y1 = in.readObject().asInstanceOf[Person]; val y2 = in.readObject().asInstanceOf[Employee]; val y3 = in.readObject().asInstanceOf[Person]; in.close(); System.out.println("x1 = " + x1); System.out.println("y1 = " + y1); System.out.println("x1 equals y1: " + (x1 equals y1) + " - y1 equals x1: " + (y1 equals x1)); System.out.println(); System.out.println("x2 = " + x2); System.out.println("y2 = " + y2); System.out.println("x2 equals y2: " + (x2 equals y2) + " - y2 equals x2: " + (y2 equals x2)); System.out.println(); System.out.println("x3 = " + x3); System.out.println("y3 = " + y3); System.out.println("x3 equals y3: " + (x3 equals y3) + " - y3 equals x3: " + (y3 equals x3)); System.out.println(); dataFile.deleteOnExit() } catch { case e: Exception => System.out.println("Error in Test5: " + e); } } //############################################################################ // Test code object Test { def main(args: Array[String]): Unit = { Test1; Test2; Test3; Test4; Test5 } } //############################################################################