So, I have to serialize some code in Java and I have used Simple (a java Xml Serialization library) before for Xml serialization with Android in Java, so I thought I would use it again for a regular java project.
Here is what I have done. Some examples have failed, some have succeed. Here are my results.
Example 1 – Serializing a simple Person object
Attempt 1 – Failed with exception
import org.simpleframework.xml.Element;
import org.simpleframework.xml.Root;
@Root
public class Person
{
	@Element
	public String FirstName;
	@Element
	public String LastName;
}
And here is the Run.java with the main method.
import java.io.File;
import org.simpleframework.xml.Serializer;
import org.simpleframework.xml.core.Persister;
public class Run
{
	public static void main(String[] args) throws Exception
	{
		Person p = new Person();
		Serializer serializer = new Persister();
		File file = new File("person.xml");
		serializer.write(p, file);
	}
}
Result
An Exception was thrown because FirstName is null. So maybe it cannot handle null values?
Attempt 2 – Succeeded
Lets try be setting the default values to an empty string.
import org.simpleframework.xml.Element;
import org.simpleframework.xml.Root;
@Root
public class Person
{
	@Element
	public String FirstName = "";
	@Element
	public String LastName = "";
}
It worked. Here is the xml file.
<person>
   <FirstName>
   <LastName>
</person>
Attempt 3 – Succeeded
Of course if we set the values for FirstName and LastName…
    Person p = new Person();
    p.FirstName = "Jared";
    p.LastName = "Barneck";
…they show in the Xml as well.
<person>
   <FirstName>Jared</FirstName>
   <LastName>Barneck</LastName>
</person>
Example 2 – Serializing a Person object with getters and setters
Attempt 1 – Succeeded
I changed the member variables to be private and created public getters and setters.
import org.simpleframework.xml.Element;
import org.simpleframework.xml.Root;
@Root
public class Person
{
	@Element
	private String FirstName = "";
	@Element
	private String LastName = "";
	public String getFirstName()
	{
		return FirstName;
	}
	public void setFirstName(String inFirstName)
	{
		FirstName = inFirstName;
	}
	public String getLastName()
	{
		return LastName;
	}
	public void setLastName(String inLastName)
	{
		LastName = inLastName;
	}
}
I now use the setters to set the values in the main method.
import java.io.File;
import org.simpleframework.xml.Serializer;
import org.simpleframework.xml.core.Persister;
public class Run
{
	public static void main(String[] args) throws Exception
	{
		Person p = new Person();
		p.setFirstName("Jared");
		p.setLastName("Barneck");
		Serializer serializer = new Persister();
		File file = new File("person.xml");
		serializer.write(p, file);
	}
}
That worked and output the desired Xml.
<person>
   <FirstName>Jared</FirstName>
   <LastName>Barneck</LastName>
</person>
Example 3 – Using a custom name
What if the name of the member variables were _FirstName and _LastName. We wouldn’t want the underscore “_” to show up in the Xml.
So what do we do? The documentation says to use this line:
@Element(name=”FirstName”)
Attempt 1 – Success
import org.simpleframework.xml.Element;
import org.simpleframework.xml.Root;
@Root
public class Person
{
	@Element(name="FirstName")
	private String _FirstName = "";
	@Element(name="LastName")
	private String _LastName = "";
	public String getFirstName()
	{
		return _FirstName;
	}
	public void setFirstName(String inFirstName)
	{
		_FirstName = inFirstName;
	}
	public String getLastName()
	{
		return _LastName;
	}
	public void setLastName(String inLastName)
	{
		_LastName = inLastName;
	}
}
This worked, and the Xml output was unchanged.
Example 3 – Serializing a List
Ok, now we want to serialize a list of Person objects.
Attempt 1 – Failed with exception
I tried to use an ArrayList<Person> and it didn’t work. The person object is the same as in example 2, but I changed the main method as follows:
import java.io.File;
import java.util.ArrayList;
import org.simpleframework.xml.Serializer;
import org.simpleframework.xml.core.Persister;
public class Run
{
	public static void main(String[] args) throws Exception
	{
		ArrayList<Person> people = new ArrayList<Person>();
		Person p1 = new Person();
		p1.setFirstName("Jared");
		p1.setLastName("Barneck");
		people.add(p1);
		Person p2 = new Person();
		p2.setFirstName("Mike");
		p2.setLastName("Michaels");
		people.add(p2);
		Serializer serializer = new Persister();
		File file = new File("people.xml");
		serializer.write(people, file);
	}
}
So that didn’t work.
Attempt 2 – Failed, no exception, just bad Xml
I created a People class that extends ArrayList<Person>.
import java.util.ArrayList;
import org.simpleframework.xml.Root;
@Root
public class People extends ArrayList<Person>
{
}
I then used this class in the main method.
	public static void main(String[] args) throws Exception
	{
		People people = new People();
		Person p1 = new Person();
		p1.setFirstName("Jared");
		p1.setLastName("Barneck");
		people.add(p1);
		Person p2 = new Person();
		p2.setFirstName("Mike");
		p2.setLastName("Michaels");
		people.add(p2);
		Serializer serializer = new Persister();
		File file = new File("people.xml");
		serializer.write(people, file);
	}
It didn’t throw and exception but the Xml was basically empty.
<people/>
That isn’t what we want.
Attempt 3 – Succeeded but not quite right
Ok, so how about a container object instead of an extending object. The documentation has an @ElementList attribute that can be used if the class contains a list. So lets use that.
import java.util.ArrayList;
import java.util.List;
import org.simpleframework.xml.ElementList;
import org.simpleframework.xml.Root;
@Root
public class People
{
	@ElementList
	List<Person> List = new ArrayList<Person>();
}
The main method changed slightly to accommodate the People class.
	public static void main(String[] args) throws Exception
	{
		People people = new People();
		Person p1 = new Person();
		p1.setFirstName("Jared");
		p1.setLastName("Barneck");
		people.List.add(p1);
		Person p2 = new Person();
		p2.setFirstName("Mike");
		p2.setLastName("Michaels");
		people.List.add(p2);
		Serializer serializer = new Persister();
		File file = new File("people.xml");
		serializer.write(people, file);
	}
The Xml was created and looks as follows:
<people>
   <List class="java.util.ArrayList">
      <person>
         <FirstName>Jared</FirstName>
         <LastName>Barneck</LastName>
      </person>
      <person>
         <FirstName>Mike</FirstName>
         <LastName>Michaels</LastName>
      </person>
   </List>
</people>
That is almost correct. However, we don’t need to the List line between People and person.
Attempt 4 – Succeeded
Ok, so I read the documentation and it said to use this to remove the useless List Xml element.
@ElementList(inline=true)
So I tried and sure enough, it worked.
<people>
   <person>
      <FirstName>Jared</FirstName>
      <LastName>Barneck</LastName>
   </person>
   <person>
      <FirstName>Mike</FirstName>
      <LastName>Michaels</LastName>
   </person>
</people>
Ok…lets continue this a bit later in another post.
Xml Serialization in Java using Simple – Inheritance