Como desativar pretty-impressão (espaço branco / nova linha) no XStream?
Pergunta
Isto é como eu criar instância XStream para XML:
XStream xstream = new XStream();
Isto é para JSON:
private final XStream xstream = new XStream(new JsonHierarchicalStreamDriver() {
public HierarchicalStreamWriter createWriter(Writer writer) {
return new JsonWriter(writer, JsonWriter.DROP_ROOT_MODE);
}
});
Ambos são bastante-impressão (recuar) a saída.
Como posso pedir o XStream para desativar a impressão bonita?
Solução 2
Com alguma ajuda da comunidade, eu descobri a resposta.
Para XML você tem que mudar a maneira como você serializar:
A linha:
xStream.toXML(o, new OutputStreamWriter(stream, encoding));
alterado para linha
xStream.marshal(o, new CompactWriter(new OutputStreamWriter(stream, encoding)));
Para JSON você só mudar a maneira como o XStream é criado. Então a inicialização do XStream é alterado para:
private final XStream xstreamOut = new XStream(new JsonHierarchicalStreamDriver() {
public HierarchicalStreamWriter createWriter(Writer writer) {
return new JsonWriter(writer, new char[0], "", JsonWriter.DROP_ROOT_MODE);
}
});
Note que o construtor JsonWriter 4 parâmetro é utilizado.
Outras dicas
Obrigado, suas mensagens ajudou !!! Aqui está o que eu uso para converter para uma string.
String strXML = "";
XStream xs = new XStream();
StringWriter sw = new StringWriter();
xs.marshal(this, new CompactWriter(sw));
strXML = sw.toString();
Use o método Marschal em xstream com um escritor compacto
xstream.marshal(someObject, new CompactWriter(out));
O comportamento padrão de impressão bonita vem do método AbstractXmlDriver.createWriter () (XStream usa XppDriver como seu motorista fluxo hierárquico padrão e isso se estende AbstractXmlDriver):
public HierarchicalStreamWriter createWriter(Writer out) {
return new PrettyPrintWriter(out, getNameCoder());
}
Se você quiser desativar pretty-impressão globalmente (mantendo todos os outros comportamentos padrão) e usar apenas o método toXML simples (o) ao invés de mexer com o outro por opções de uso sugerido aqui, você pode inicializar sua instância XStream como segue. Isso substitui o método acima com um CompactWriter vez.
XStream xstream = new XStream(new XppDriver() {
@Override
public HierarchicalStreamWriter createWriter(Writer out) {
return new CompactWriter(out, getNameCoder());
}
});
Crie sua instância XStream desta forma:
XStream xstream = new XStream(new JsonHierarchicalStreamDriver() {
public HierarchicalStreamWriter createWriter(Writer writer) {
return new JsonWriter(writer, JsonWriter.DROP_ROOT_MODE, new JsonWriter.Format(new char[0], new char[0], 0));
}
});
Aqui é um construtor de classe Formato:
/**
* Create a new Formatter.
*
* @param lineIndenter the characters used for indenting the line
* @param newLine the characters used to create a new line
* @param mode the flags for the format modes
* @since 1.4
*/
public Format(char[] lineIndenter, char[] newLine, int mode) {
this(lineIndenter, newLine, mode, new NoNameCoder());
}
Verifique o código fonte de JsonWriter
para mais informações