Java: сохранить объект для последующего использования
Получение данных с сервера (с использованием методов SOAP) происходит медленно, и я хотел бы, чтобы программа загружалась с уже существующим объектом. Я попробовал код, который нашел здесь, но он поднимает java.io.NotSerializableException
Теперь мне нужны данные, чтобы остаться нетронутыми. Есть ли способ сохранить его без изменения?
В этом посте были и другие ответы о том, как сериализовать данные, но я боюсь, что это искажает результаты, которые я получаю со статическим объектом.
3 ответа
java.io.NotSerializableException - Это происходит, если ваш класс не реализует Сериализуемый. Объект класса Serializable будет записан в файл в виде последовательности байтов, содержащих всю информацию об этом объекте.
Если вы не хотите использовать его, есть другие способы сериализации объектов, такие как JSON или MessagePack ... Просто проведите исследование и найдите тот, который лучше всего соответствует вашим потребностям.
Я думаю, что ваша проблема не связана с SOAP или передачей данных, а только с сериализацией Java. Ваш класс сериализуем? Можете ли вы написать простой основной метод написания и чтения вашего экземпляра в файл или ByteArrayOutputStream? Смотрите здесь.
Если / когда ваш объект сериализуем, вам необходимо отделить чтение данных от части десериализации. Используйте ByteArrayOutputStream для сбора данных (или временного файла для очень больших данных) и выполните десериализацию после завершения передачи данных.
Весь процесс не будет быстрее, и это не решит никаких ошибок сериализации / десериализации, он просто позволяет разделить две части, позволяя вам использовать разные потоки или асинхронность для лучшего использования ресурсов сервера.
Вы можете использовать JSON сериализатор, как Джексон, чтобы сделать это. В идеале у объекта должны быть соответствующие средства получения данных, о которых вы упомянули, что вам нужно остаться нетронутыми. Даже если данные являются частными, вы можете сказать Джексону сериализовать их в любом случае, используя отражение.
ObjectMapper mapper = new ObjectMapper();
// You can use these options if the object doesn't have getters
// for fields that need to be saved, and the fields are private.
mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
// Save the string representation somewhere
String yourObjectAsAJsonString = mapper.writeValueAsString(yourObject);
// Load the object back from the string representation
YourObject yourObjectDeserialized = mapper.readValue(yourObjectAsAJsonString, YourObject.class);
Ваша проблема с java.io.NotSerializableException
вероятно, не находится под вашим контролем, потому что вы получаете объект через SOAP, поэтому вы не можете заставить его реализовать Serializable
после факта. Использование JSON-сериализатора, такого как Джексон, может помочь вам обойти эту проблему.