Problema com XStream [*RESOLVIDO]

Estou utizando o XStream para gravar os arquivos de configuração do meu sistema. Quando executo o toXML ocorre tudo perfeitamente. Porém quando tento ler o objeto do arquivo, está acontecendo o seguinte erro:

Exception in thread “main” com.thoughtworks.xstream.io.StreamException: : only whitespace content allowed before start tag and not / (position: START_DOCUMENT seen /… @1:1)

Este erro aconteceu quando usei o XppDomDriver. Quando uso o DomDriver ocorre outro problema:

[Fatal Error] :1:1: Content is not allowed in prolog.
Exception in thread “main” com.thoughtworks.xstream.io.StreamException: : Content is not allowed in prolog.
at com.thoughtworks.xstream.io.xml.DomDriver.createReader(DomDriver.java:86)
at com.thoughtworks.xstream.io.xml.DomDriver.createReader(DomDriver.java:66)
at com.thoughtworks.xstream.XStream.fromXML(XStream.java:861)
at com.thoughtworks.xstream.XStream.fromXML(XStream.java:853)

Alguém sabe como resolver isto?

Segue o código da classe que estou utilizando e a classe que usei para fazer o teste:

public class ConfigurationService extends ServiceAdapter
{
	
	private NetConfig netConfig;
	private File netConfigFile;
	private XStream serializer;
	
	@Override
	public void initialize()
	{
		serializer = new XStream(new DomDriver());
		serializer.alias("NetConfig", NetConfig.class);
		serializer.omitField(NetConfig.class, "serverPort");
		serializer.omitField(NetConfig.class, "useSSL");
		
		netConfigFile = new File(System.getProperty("user.dir")+File.separator+
                        "conf"+File.separator+"net-config.xml");
		if (netConfigFile.exists()) {
			netConfig = (NetConfig) serializer.fromXML(netConfigFile.getPath());
		} else {
			netConfig = getNetConfigDefault();
		}
	}
	
	public NetConfig getNetConfig()
	{
		return netConfig;
	}
		
	public NetConfig getNetConfigDefault()
	{
		NetConfig config = new NetConfig();
		config.setServerAddress("localhost");
		config.setServerPort(3001);
		config.setConnectionTimeout(3);
		config.setConnectionTries(2);
		config.setWriteTimeout(3);
		config.setIdleTime(3);
		config.setUseSSL(true);
		return config;
	}
	
	public void updateNetConfig() 
	{
		try {
			if (!netConfigFile.exists()){
				createConfigDirectory();
			}
			BufferedWriter out = new BufferedWriter(new FileWriter(netConfigFile));
			serializer.toXML(netConfig, out);
			out.close();
		} catch (IOException ex) {
			ex.printStackTrace();
		}
	}
	
	private void createConfigDirectory()
	{
		File confDirectory = new File(System.getProperty("user.dir")+File.separator+"conf"+File.separator);
		if (!confDirectory.exists()) {
			confDirectory.mkdir();
		}
	}
public class Teste {
	
	public static void main (String[] args)
	{
		ConfigurationService service = new ConfigurationService();
		service.initialize();
		NetConfig netConfig = service.getNetConfig();
		System.out.println(netConfig);
		netConfig.setConnectionTimeout(10);
		service.updateNetConfig();
                netConfig = service.getNetConfig();
	}
	
}

acredito que seja alguma má formação do seu xml… Vc pode postar o xml serializado?

Consegui resolver o problema. Tive que usar o outro método fromXML (InputStream), Não sei porque este que estava usando, em que é passado o path do arquivo como parâmetro, não funciona. Deve ser algum bug do XStream.

Segue a classe que criei para fazer a serialização, caso alguém tenha o mesmo problema:

public class XmlSerializer extends XStream
{

	public XmlSerializer(HierarchicalStreamDriver arg0)
	{
		super(arg0);
	}
	
	public boolean serialize(String path, Object obj)
	{
		FileOutputStream fos = null;
		try {
			File file = new File(path);
			if (file.isDirectory()) {
				throw new IllegalArgumentException ("The path must point to a file.");
			}
			if (!file.exists()) {
				File parentFile = file.getParentFile();
				if (!parentFile.exists()) {
					parentFile.mkdirs();
				}
				file.createNewFile();
			}
			fos = new FileOutputStream(file);
			toXML(obj, fos);
			return true;
		} catch (Throwable e) {
			return false;
		} finally {
			try { if (fos != null) fos.close(); } catch (IOException e) {}
		}
	}
	
	public boolean deserialize(String path, Object obj)
	{
		FileInputStream fis = null;
		try {
			File file = new File(path);
			if (file.isDirectory()) {
				throw new IllegalArgumentException ("The path must point to a file.");
			}
			if (file.exists()) {
				fis = new FileInputStream(path);
				fromXML(fis, obj);
				return true;
			}
			return false;
		} catch (Throwable e) {
			return false;
		} finally {
			try { if (fis != null) fis.close(); } catch (IOException e) {}
		}
	}
	
}

Excelente! Parabéns.

Tive o mesmo problema e resolvi assim:

try {
    Gerentes gerentes = (Gerentes)xstream.fromXML(new FileInputStream(new File("src/gerentes.xml")));
} catch (FileNotFoundException e) {
    e.printStackTrace();
}
2 curtidas