/* * Copyright (C) 2007 XStream Committers. * All rights reserved. * * The software in this package is published under the terms of the BSD * style license a copy of which has been included with this distribution in * the LICENSE.txt file. * * Created on 29. July 2007 by Joerg Schaible */ package com.thoughtworks.xstream.converters.reflection; import com.thoughtworks.acceptance.objects.StandardObject; import com.thoughtworks.xstream.XStream; import junit.framework.TestCase; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.ObjectStreamField; import java.io.Serializable; /** * @author Jörg Schaible */ public class SerializableConverterTest extends TestCase { static class SimpleType extends StandardObject { private String one; private String two; public String getOne() { return this.one; } public void setOne(String one) { this.one = one; } public String getTwo() { return this.two; } public void setTwo(String two) { this.two = two; } private void writeObject(final ObjectOutputStream out) throws IOException { out.defaultWriteObject(); } private void readObject(final ObjectInputStream in) throws IOException, ClassNotFoundException { in.defaultReadObject(); } } public void testCanOmitFieldAtSerialization() { XStream xstream = new XStream(); xstream.alias("simple", SimpleType.class); xstream.omitField(SimpleType.class, "two"); String expected = "" + "<simple serialization=\"custom\">\n" + " <simple>\n" + " <default>\n" + " <one>one</one>\n" + " </default>\n" + " </simple>\n" + "</simple>"; SimpleType simple = new SimpleType(); simple.setOne("one"); simple.setTwo("two"); String xml = xstream.toXML(simple); assertEquals(expected, xml); } public void testCanOmitFieldAtDeserialization() { XStream xstream = new XStream(); xstream.alias("simple", SimpleType.class); xstream.omitField(SimpleType.class, "two"); xstream.omitField(SimpleType.class, "x"); String xml = "" + "<simple serialization=\"custom\">\n" + " <simple>\n" + " <default>\n" + " <one>one</one>\n" + " <x>x</x>\n" + " </default>\n" + " </simple>\n" + "</simple>"; SimpleType simple = new SimpleType(); simple.setOne("one"); SimpleType serialized = (SimpleType)xstream.fromXML(xml); assertEquals(simple, serialized); } static class ExtendedType extends SimpleType { private String three; public String getThree() { return this.three; } public void setThree(String three) { this.three = three; } private void writeObject(final ObjectOutputStream out) throws IOException { out.defaultWriteObject(); } private void readObject(final ObjectInputStream in) throws IOException, ClassNotFoundException { in.defaultReadObject(); } } public void testCanOmitInheritedFieldAtSerialization() { XStream xstream = new XStream(); xstream.alias("extended", ExtendedType.class); xstream.alias("simple", SimpleType.class); xstream.omitField(SimpleType.class, "two"); String expected = "" + "<extended serialization=\"custom\">\n" + " <simple>\n" + " <default>\n" + " <one>one</one>\n" + " </default>\n" + " </simple>\n" + " <extended>\n" + " <default>\n" + " <three>three</three>\n" + " </default>\n" + " </extended>\n" + "</extended>"; ExtendedType extended = new ExtendedType(); extended.setOne("one"); extended.setTwo("two"); extended.setThree("three"); String xml = xstream.toXML(extended); assertEquals(expected, xml); } public void testCanOmitInheritedFieldAtDeserialization() { XStream xstream = new XStream(); xstream.alias("extended", ExtendedType.class); xstream.alias("simple", SimpleType.class); xstream.omitField(SimpleType.class, "two"); xstream.omitField(SimpleType.class, "x"); String xml = "" + "<extended serialization=\"custom\">\n" + " <simple>\n" + " <default>\n" + " <one>one</one>\n" + " <x>x</x>\n" + " </default>\n" + " </simple>\n" + " <extended>\n" + " <default>\n" + " <three>three</three>\n" + " </default>\n" + " </extended>\n" + "</extended>"; ExtendedType extended = new ExtendedType(); extended.setOne("one"); extended.setThree("three"); SimpleType serialized = (SimpleType)xstream.fromXML(xml); assertEquals(extended, serialized); } public static class SimpleNamedFieldsType extends StandardObject implements Serializable { private String one; private String two; public String getOne() { return this.one; } public void setOne(String one) { this.one = one; } public String getTwo() { return this.two; } public void setTwo(String two) { this.two = two; } private static final ObjectStreamField[] serialPersistentFields = { new ObjectStreamField("s1", String.class), new ObjectStreamField("s2", String.class), }; private void writeObject(ObjectOutputStream out) throws IOException { // don't call defaultWriteObject() ObjectOutputStream.PutField fields = out.putFields(); fields.put("s1", one); fields.put("s2", two); out.writeFields(); } private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { // don't call defaultReadObject() ObjectInputStream.GetField fields = in.readFields(); one = (String) fields.get("s1", "1"); two = (String) fields.get("s2", "2"); } } public void testCanOmitNamedFieldAtSerialization() { XStream xstream = new XStream(); xstream.alias("simple", SimpleNamedFieldsType.class); xstream.omitField(SimpleNamedFieldsType.class, "s2"); String expected = "" + "<simple serialization=\"custom\">\n" + " <simple>\n" + " <default>\n" + " <s1>one</s1>\n" + " </default>\n" + " </simple>\n" + "</simple>"; SimpleNamedFieldsType simple = new SimpleNamedFieldsType(); simple.setOne("one"); simple.setTwo("two"); String xml = xstream.toXML(simple); assertEquals(expected, xml); } public void testCanOmitNamedFieldAtDeserialization() { XStream xstream = new XStream(); xstream.alias("simple", SimpleNamedFieldsType.class); xstream.omitField(SimpleNamedFieldsType.class, "s2"); xstream.omitField(SimpleNamedFieldsType.class, "x"); String xml = "" + "<simple serialization=\"custom\">\n" + " <simple>\n" + " <default>\n" + " <s1>one</s1>\n" + " <x>x</x>\n" + " </default>\n" + " </simple>\n" + "</simple>"; SimpleNamedFieldsType simple = new SimpleNamedFieldsType(); simple.setOne("one"); simple.setTwo("2"); SimpleNamedFieldsType serialized = (SimpleNamedFieldsType)xstream.fromXML(xml); assertEquals(simple, serialized); } public void testCanAliasField() { XStream xstream = new XStream(); xstream.alias("simple", SimpleType.class); xstream.aliasField("s2", SimpleType.class, "two"); String expected = "" + "<simple serialization=\"custom\">\n" + " <simple>\n" + " <default>\n" + " <one>one</one>\n" + " <s2>two</s2>\n" + " </default>\n" + " </simple>\n" + "</simple>"; SimpleType simple = new SimpleType(); simple.setOne("one"); simple.setTwo("two"); String xml = xstream.toXML(simple); assertEquals(expected, xml); SimpleType serialized = (SimpleType)xstream.fromXML(xml); assertEquals(simple, serialized); } public void testCanAliasNamedField() { XStream xstream = new XStream(); xstream.alias("simple", SimpleNamedFieldsType.class); xstream.aliasField("two", SimpleNamedFieldsType.class, "s2"); String expected = "" + "<simple serialization=\"custom\">\n" + " <simple>\n" + " <default>\n" + " <s1>one</s1>\n" + " <two>two</two>\n" + " </default>\n" + " </simple>\n" + "</simple>"; SimpleNamedFieldsType simple = new SimpleNamedFieldsType(); simple.setOne("one"); simple.setTwo("two"); String xml = xstream.toXML(simple); assertEquals(expected, xml); SimpleNamedFieldsType serialized = (SimpleNamedFieldsType)xstream.fromXML(xml); assertEquals(simple, serialized); } }