Подтвердить что ты не робот

Как отключить красивую печать (пробел/новая линия) в XStream?

Вот как я создаю экземпляр XStream для XML:

XStream xstream = new XStream();

Это для JSON:

private final XStream xstream = new XStream(new JsonHierarchicalStreamDriver() {
        public HierarchicalStreamWriter createWriter(Writer writer) {
            return new JsonWriter(writer, JsonWriter.DROP_ROOT_MODE);
        }
    });

Оба из них довольно печатают (отступы) вывод.

Как я могу попросить XStream отключить красивую печать?

4b9b3361

Ответ 1

С некоторой помощью со стороны сообщества я понял ответ.

Для XML вам необходимо изменить способ сериализации:

Строка:

xStream.toXML(o, new OutputStreamWriter(stream, encoding));

изменено на строку

xStream.marshal(o, new CompactWriter(new OutputStreamWriter(stream, encoding)));

Для JSON вы изменяете способ создания XStream. Таким образом, инициализация XStream изменяется на:

private final XStream xstreamOut = new XStream(new JsonHierarchicalStreamDriver() {
    public HierarchicalStreamWriter createWriter(Writer writer) {
        return new JsonWriter(writer, new char[0], "", JsonWriter.DROP_ROOT_MODE);
    }
});

Обратите внимание, что используется 4-параметрический конструктор JsonWriter.

Ответ 2

Спасибо, ваши сообщения помогли!!! Вот что я использую для преобразования в String.

String strXML = "";
XStream xs = new XStream();
StringWriter sw = new StringWriter();
xs.marshal(this,  new CompactWriter(sw));
strXML = sw.toString();

Ответ 3

Использовать метод marschal для xstream с компактным писателем

xstream.marshal(someObject, new CompactWriter(out)); 

Ответ 4

Поведение по умолчанию довольно печатается из метода AbstractXmlDriver.createWriter() (XStream использует XppDriver в качестве его иерархического драйвера потока по умолчанию, и это расширяет AbstractXmlDriver):

public HierarchicalStreamWriter createWriter(Writer out) {
    return new PrettyPrintWriter(out, getNameCoder());
}

Если вы хотите отключить красивую печать во всем мире (при сохранении всех других действий по умолчанию) и просто использовать простой метод toXML (o), а не использовать другие варианты использования, предложенные здесь, вы можете инициализировать экземпляр XStream как следующим образом. Вместо этого этот метод отменяется с помощью CompactWriter.

XStream xstream = new XStream(new XppDriver() {
    @Override
    public HierarchicalStreamWriter createWriter(Writer out) {
        return new CompactWriter(out, getNameCoder());
    }
});

Ответ 5

Создайте свой экземпляр XStream следующим образом:

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));
        }
});

Вот конструктор класса Format:

/**
 * 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());
}

Проверьте исходный код JsonWriter для получения дополнительной информации