2013-09-28 4 views
0

Мне нужно сохранить список строк в одном поле на Java. Порядок важен, и я предпочел бы, чтобы он хранился в формате, удобном для человека.Сохраните список строк как удобочитаемый путь

Идеальное решение будет хранить его как xPath, но я знаю только библиотеки для компиляции сложных xml-файлов в xPath, а не списки строк.

Мои собственные письменные решения легко усложняются, потому что я хочу поддерживать строки, содержащие любой символ, в том числе тот, который я использую в качестве разделителя.

Я в настоящее время используют сериализацию таким образом:

String[] items = new String[3]; 
items[0] = item1; 
items[1] = item2; 
items[2] = item3; 
byte[] bytes = SerializationUtils.serialize(items); 
System.out.println("Serialized:\n"+Arrays.toString(bytes)); 

String[] read = (String[]) SerializationUtils.deserialize(bytes); 
System.out.println("Read:"); 
for(String s : read) { 
    System.out.println(s); 
} 

Выход:

[-84, -19, 0, 5, 117, 114, 0, 19, 91, 76, 106, 97, 118, 97, 46, 108, 97, 110, 103, 46, 83, 116, 114, 105, 110, 103, 59, -83, -46, 86, -25, -23, 29, 123, 71, 2, 0, 0, 120, 112, 0, 0, 0, 3, 116, 0, 7, 110, 117, 109, 98, 101, 114, 49, 116, 0, 8, 110, 117, 109, 98, 101, 114, 47, 50, 116, 0, 8, 110, 117, 109, 98, 101, 114, 92, 51]

Это работает, но кроме генерации очень длинную строку, он также генерирует Беспоставочной - читаемая человеком строка.

Как я могу лучше всего сохранить этот путь, с точки зрения человека, и как мало осложнений в моем коде, насколько это возможно?

Решение

Это мое решение, используя OstermillerUtils как предложено ct_ (спасибо!).

String item1="number1"; 
String item2="number/2"; 
String item3="number\\3"; 
String item4="//number/4\\"; 
String item5=",num\"ber5,"; 
String item6="number,6"; 
String[] items = new String[6]; 
items[0] = item1; 
items[1] = item2; 
items[2] = item3; 
items[3] = item4; 
items[4] = item5; 
items[5] = item6; 

    System.out.println("Test values"); 
for(String s : items) { 
    System.out.println(s); 
} 

StringWriter writer = new StringWriter(); 
CSVPrinter printer = new CSVPrinter(writer); 
printer.changeDelimiter('/'); 
printer.write(items); 
System.out.println("Persisted:\n\t"+writer.toString()); 

String[][] results = CSVParser.parse(writer.toString(), '/'); 
for (int j=0; j<results[0].length; j++){ 
    System.out.println(results[0][j]); 
} 
+0

Что вы подразумеваете под 'человеко-читаемым форматом'? – ssedano

+0

Вместо вывода, напечатанного выше, например, что-то вроде xPath, например 'item1/item2/item3'. –

+0

Вывод, который вы получаете, относится к 'Arrays.toString (bytes)'. Вы печатаете массив байтов. Что вы ожидаете получить? –

ответ

2

Итак, вы хотите сериализовать и десериализовать массив строк в строку и обратно? Посмотрите на http://ostermiller.org/utils/CSV.html - он может сериализовать и десериализовать массивы с использованием произвольного делиметра.

+0

Просто ТОЧНО, что я искал! Благодаря! :) –

+0

Без проблем - рад, что это помогло. –

0

JAXB только с использованием аннотаций будет работать. Лучше всего, если у вас есть один контейнерный класс со списком. Затем вы получаете XML.

Смежные вопросы