[Simple-support] Tutorial #3: "Nested object serialization" fails on deserialization
Brought to you by:
niallg
|
From: Lee R. <le...@rh...> - 2012-02-20 22:21:24
|
Hi,
I am a newbie so I started implementing & testing the examples from the
tutorial right from the top.
When I got to #3 "Nested object serialization", the forward serialization
worked like a charm. However, the attempting the reverse deserialization
fails:
org.simpleframework.xml.core.PersistenceException: Constructor not matched
for class Security
at
org.simpleframework.xml.core.ClassCreator.getInstance(ClassCreator.java:109)
at
org.simpleframework.xml.core.Composite.readConstructor(Composite.java:288)
at org.simpleframework.xml.core.Composite.read(Composite.java:236)
at org.simpleframework.xml.core.Composite.read(Composite.java:202)
at org.simpleframework.xml.core.Composite.read(Composite.java:150)
at org.simpleframework.xml.core.Composite.readVariable(Composite.java:687)
at org.simpleframework.xml.core.Composite.readInstance(Composite.java:635)
at org.simpleframework.xml.core.Composite.readUnion(Composite.java:610)
at org.simpleframework.xml.core.Composite.readElement(Composite.java:593)
at org.simpleframework.xml.core.Composite.readElements(Composite.java:506)
at org.simpleframework.xml.core.Composite.readSection(Composite.java:388)
at org.simpleframework.xml.core.Composite.read(Composite.java:367)
at org.simpleframework.xml.core.Composite.read(Composite.java:234)
at org.simpleframework.xml.core.Composite.read(Composite.java:202)
at org.simpleframework.xml.core.Composite.read(Composite.java:150)
at org.simpleframework.xml.core.Composite.readVariable(Composite.java:687)
at org.simpleframework.xml.core.Composite.readInstance(Composite.java:635)
at org.simpleframework.xml.core.Composite.readUnion(Composite.java:610)
at org.simpleframework.xml.core.Composite.readElement(Composite.java:593)
at org.simpleframework.xml.core.Composite.readElements(Composite.java:506)
at org.simpleframework.xml.core.Composite.readSection(Composite.java:388)
at org.simpleframework.xml.core.Composite.read(Composite.java:367)
at org.simpleframework.xml.core.Composite.read(Composite.java:234)
at org.simpleframework.xml.core.Composite.read(Composite.java:202)
at org.simpleframework.xml.core.Composite.read(Composite.java:150)
at org.simpleframework.xml.core.Traverser.read(Traverser.java:92)
at org.simpleframework.xml.core.Persister.read(Persister.java:632)
at org.simpleframework.xml.core.Persister.read(Persister.java:613)
at org.simpleframework.xml.core.Persister.read(Persister.java:591)
at org.simpleframework.xml.core.Persister.read(Persister.java:550)
at org.simpleframework.xml.core.Persister.read(Persister.java:528)
at org.simpleframework.xml.core.Persister.read(Persister.java:433)
at
com.yahoo.monarch.SimpleTutorial.deserializeConfiguration(SimpleTutorial.jav
a:72)
at com.yahoo.monarch.SimpleTutorial.main(SimpleTutorial.java:98)
The ClassCreator.getInstance(context, criteria) is getting a null back from
the getInitializer(context, criteria) method and throws the exception.
In order to load data into the classes for the forward serialization I added
simple constructors to the code shown in the tutorial (see below).
I presume those were omitted to reduce clutter.
Nonetheless, I'm stuck. Any help would be appreciated.
Thanks!
Lee.
The concatenated code (minus imports):
<pre>
@Root
public class Configuration {
@Element
private Server server;
@Attribute
private int id;
public Configuration(Server server, int id) {
this.server = server;
this.id = id;
}
public int getIdentity() { return id; }
public Server getServer() { return server; }
}
//***
public class Server {
@Attribute
private int port;
@Element
private String host;
@Element
private Security security;
public Server(Security sec, String host, int port) {
this.security = sec;
this.host = host;
this.port = port;
}
public int getPort() { return port; }
public String getHost() { return host; }
public Security getSecurity() { return security; }
}
//***
public class Security {
@Attribute
private boolean ssl;
@Element
private String keyStore;
public Security(boolean ssl, String keyStore) {
this.ssl = ssl;
this.keyStore = keyStore;
}
public boolean isSSL() { return ssl; }
public String getKeyStore() { return keyStore; }
}
//***
public static void serializeConfiguration() { //This works
//create hierarchy
Security sec = new Security(true, "KeyStoreURL");
Server server = new Server(sec, "myHost.yahoo.com", 8080);
Configuration config = new Configuration(server, 101);
//serialize to XML
Serializer serializer = new Persister();
File result = new File("configuration.xml");
try {
serializer.write(config, result);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void deserializeConfiguration() { //This fails
Serializer serializer = new Persister();
File source = new File("configuration.xml");
Configuration config = null;
try {
config = serializer.read(Configuration.class, source); //Throws above
exception
} catch (Exception e) {
e.printStackTrace();
}
println("Class: Configuration");
if (config != null) {
Server svr = config.getServer();
if (svr != null) {
Security sec = svr.getSecurity();
if (sec != null) {
println("Security.ssl: "+sec.isSSL());
println("Security.keyStore: "+sec.getKeyStore());
}
println("Server.host: "+svr.getHost());
println("Server.port: "+svr.getPort());
}
println("Configuraiton.id: "+config.getIdentity());
}
}
</pre>
|