Данные MBCS при выполнении степа в базе данных весенних партий - PullRequest
0 голосов
/ 14 июня 2019

Я использую подпружиненную партию с Jdbc и Postgres DB. все данные о выполнении задания и шага сохраняются в таблицах, созданных с помощью пакетного режима в БД PostgreS.

Я использую его для сохранения некоторых данных контекста шага, которые сохраняются в таблице batch_step_execution_context в столбце SERIALIZED_CONTEXT. Данные, которые я сохраняю, содержат несколько символов MBCS.

но я вижу, что при записи данных в таблицу и чтении из нее используется кодировка ISO-8859-1. следовательно, мои символы mbcs, хотя и сериализованные сериализатором по умолчанию Xstream, сохраняются как мусор.

любой способ обойти это, чтобы я мог получать и сохранять данные как MBCS.

пожалуйста, найдите фрагмент кода из JDBCExecutionContextDao.

private String serializeContext(ExecutionContext ctx) {
        Map<String, Object> m = new HashMap<String, Object>();
        for (Entry<String, Object> me : ctx.entrySet()) {
            m.put(me.getKey(), me.getValue());
        }

        ByteArrayOutputStream out = new ByteArrayOutputStream();
        String results = "";

        try {
            serializer.serialize(m, out);
            results = new String(out.toByteArray(), "ISO-8859-1");
        }
        catch (IOException ioe) {
            throw new IllegalArgumentException("Could not serialize the execution context", ioe);
        }

        return results;
    }

    private class ExecutionContextRowMapper implements RowMapper<ExecutionContext> {

        @Override
        public ExecutionContext mapRow(ResultSet rs, int i) throws SQLException {
            ExecutionContext executionContext = new ExecutionContext();
            String serializedContext = rs.getString("SERIALIZED_CONTEXT");
            if (serializedContext == null) {
                serializedContext = rs.getString("SHORT_CONTEXT");
            }

            Map<String, Object> map;
            try {
                ByteArrayInputStream in = new ByteArrayInputStream(serializedContext.getBytes("ISO-8859-1"));
                map = serializer.deserialize(in);
            }
            catch (IOException ioe) {
                throw new IllegalArgumentException("Unable to deserialize the execution context", ioe);
            }
            for (Map.Entry<String, Object> entry : map.entrySet()) {
                executionContext.put(entry.getKey(), entry.getValue());
            }
            return executionContext;
        }
    }

Я ожидаю, что буду хранить и извлекать данные MBC.

1 Ответ

0 голосов
/ 14 июня 2019

, следовательно, мои символы mbcs, хотя и сериализованные сериализатором по умолчанию Xstream, сохраняются как мусор.

XStreamExecutionContextStringSerializer устарела, мы рекомендуем вместо этого использовать Jackson2ExecutionContextStringSerializer.

Тем не менее, если вы хотите использовать многобайтовые символы для данных контекста выполнения, вам необходимо увеличить размер столбцов в схеме метаданных.Это объясняется в разделе международных и многобайтовых символов справочной документации.

...