Как сериализовать сложный объект Map? - PullRequest
0 голосов
/ 05 ноября 2018

Я должен передать объект через систему, где я могу передавать только строки. Сериализация идеально подходит для того, что мне нужно, но я не могу заставить этот объект метрики правильно сериализоваться.

Java, создающая объект:

Map<String, HashMap<String, String>> metrics = new HashMap<String, HashMap<String, String>>();
String serializedObject = "";
            try {
                 ByteArrayOutputStream bo = new ByteArrayOutputStream();
                 ObjectOutputStream so = new ObjectOutputStream(bo);
                 so.writeObject(metrics);
                 so.close();
                 serializedObject = bo.toString();
            } catch (Exception e) {
                 System.out.println(e);
            }

… передать serializedObject в виде строки…

Java, стерилизующий объект обратно в объект метрики.

Map<String, HashMap<String, String>> metrics = new HashMap<String, HashMap<String, String>>();

try {
                 byte b[] = serializedObject.getBytes(); 
                 ByteArrayInputStream bi = new ByteArrayInputStream(b);
                 ObjectInputStream si = new ObjectInputStream(bi);
                 metrics = (Map<String, HashMap<String, String>>) si.readObject();
                 si.close();
            } catch (Exception e) {
                 System.out.println(e);
            }

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

1 Ответ

0 голосов
/ 06 ноября 2018

Это потому, что вы отображаете byte[] на String, используя toString() и getBytes(). Это не сработает, ваши сериализованные данные будут повреждены, потому что эти String методы не предназначены для обработки случайных последовательностей байтов.

Если вам нужно передать byte[], напишите его и прочитайте, используя InputStream.read() и OutputStream.write(). Например, просто передавая byte[] с new ByteArrayInputStream(bo.toByteArray()), вы получите:

Map<String, Map<String, String>> metrics = new HashMap<>();
metrics.put("test", new HashMap<>());

ByteArrayOutputStream bo = new ByteArrayOutputStream();

ObjectOutputStream so = new ObjectOutputStream(bo);
so.writeObject(metrics);
so.close();

ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
ObjectInputStream si = new ObjectInputStream(bi);
Map<String, Map<String, String>> result = (Map<String, Map<String, String>>) si.readObject();
si.close();

System.out.println(result.equals(metrics)); // true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...