--- /dev/null
+<object-stream>
+ <com.billkuker.rocketry.motorsim.motors.kuker.PVC9>
+ <chamber class="com.billkuker.rocketry.motorsim.CylindricalChamber">
+ <length>200 mm</length>
+ <iD>30 mm</iD>
+ </chamber>
+ <grain class="com.billkuker.rocketry.motorsim.grain.MultiGrain">
+ <grain class="com.billkuker.rocketry.motorsim.grain.CoredCylindricalGrain">
+ <foreEndInhibited>false</foreEndInhibited>
+ <aftEndInhibited>false</aftEndInhibited>
+ <length>70 mm</length>
+ <endLight>0 mm</endLight>
+ <oD>29 mm</oD>
+ <iD>8 mm</iD>
+ <outerSurfaceInhibited>true</outerSurfaceInhibited>
+ <innerSurfaceInhibited>false</innerSurfaceInhibited>
+ </grain>
+ <count>2</count>
+ <flush>1.0</flush>
+ <delay>0 mm</delay>
+ </grain>
+ <nozzle class="com.billkuker.rocketry.motorsim.ConvergentDivergentNozzle">
+ <throatDiameter>7.9 mm</throatDiameter>
+ <exitDiameter>9 mm</exitDiameter>
+ <efficiency>0.87</efficiency>
+ </nozzle>
+ <fuel class="com.billkuker.rocketry.motorsim.fuel.KNSU">
+ <t>English</t>
+ </fuel>
+ <name>PVC9</name>
+ </com.billkuker.rocketry.motorsim.motors.kuker.PVC9>
+</object-stream>
\ No newline at end of file
--- /dev/null
+package com.billkuker.rocketry.motorsim.io;\r
+\r
+import java.io.File;\r
+import java.io.FileReader;\r
+import java.io.FileWriter;\r
+import java.io.IOError;\r
+import java.io.IOException;\r
+import java.io.ObjectInputStream;\r
+import java.io.ObjectOutputStream;\r
+import java.io.StringWriter;\r
+\r
+import org.jscience.physics.amount.Amount;\r
+\r
+import com.billkuker.rocketry.motorsim.Motor;\r
+import com.billkuker.rocketry.motorsim.MotorPart;\r
+import com.thoughtworks.xstream.XStream;\r
+import com.thoughtworks.xstream.converters.Converter;\r
+import com.thoughtworks.xstream.converters.MarshallingContext;\r
+import com.thoughtworks.xstream.converters.UnmarshallingContext;\r
+import com.thoughtworks.xstream.io.HierarchicalStreamReader;\r
+import com.thoughtworks.xstream.io.HierarchicalStreamWriter;\r
+\r
+public class MotorIO {\r
+ static class AmountConverter implements Converter{\r
+ \r
+ public void marshal(Object o, HierarchicalStreamWriter w, MarshallingContext c) {\r
+ Amount a = (Amount)o;\r
+ String text;\r
+ //Leave off the fractional part if it is not relevant so we get exact values back\r
+ if (a.isExact())\r
+ text = a.getExactValue() + " " + a.getUnit();\r
+ else\r
+ text = a.doubleValue(a.getUnit()) + " " + a.getUnit();\r
+ w.setValue(text);\r
+ }\r
+\r
+ public Object unmarshal(HierarchicalStreamReader r, UnmarshallingContext c) {\r
+ String text = r.getValue();\r
+ return Amount.valueOf(text);\r
+ }\r
+\r
+ public boolean canConvert(Class c) {\r
+ return c.equals(Amount.class);\r
+ }\r
+ \r
+ \r
+ }\r
+ \r
+ private static XStream getXStream(){\r
+ XStream xstream = new XStream();\r
+ xstream.setMode(XStream.XPATH_ABSOLUTE_REFERENCES);\r
+ xstream.omitField(MotorPart.class, "pcs");\r
+ xstream.omitField(MotorPart.class, "vcs");\r
+ xstream.registerConverter(new AmountConverter());\r
+ return xstream;\r
+ }\r
+ \r
+ public static void writeMotor(Motor m, File f) throws IOException{\r
+ FileWriter fout = new FileWriter(f);\r
+ ObjectOutputStream out = getXStream().createObjectOutputStream(fout);\r
+ out.writeObject(m);\r
+ out.close();\r
+ fout.close();\r
+ }\r
+ \r
+ public static Motor readMotor(File f) throws IOException{\r
+ ObjectInputStream in = getXStream().createObjectInputStream(new FileReader(f));\r
+ Motor m;\r
+ try {\r
+ m = (Motor)in.readObject();\r
+ } catch (ClassNotFoundException e) {\r
+ throw new IOException("Can not read motor: Class not found.", e);\r
+ }\r
+ return m;\r
+ }\r
+ \r
+}\r
--- /dev/null
+package com.billkuker.rocketry.motorsim.test;\r
+\r
+import java.io.File;\r
+\r
+import org.junit.Test;\r
+\r
+import com.billkuker.rocketry.motorsim.Motor;\r
+import com.billkuker.rocketry.motorsim.io.MotorIO;\r
+import com.billkuker.rocketry.motorsim.motors.kuker.PVC9;\r
+\r
+\r
+public class MotorIOTest {\r
+\r
+ @Test\r
+ public void testReadWrite() throws Exception{\r
+ Motor m = new PVC9();\r
+ File f = new File("MotorIOTest.xml");\r
+ \r
+ MotorIO.writeMotor(m, f);\r
+ \r
+ Motor r = MotorIO.readMotor(f);\r
+ \r
+ \r
+ }\r
+}\r