Java:保存对象供以后使用

时间:2017-05-13 13:00:30

标签: java soap cisco-axl

从服务器中提取数据(使用SOAP方法)很慢,我希望程序加载已存在的对象。我尝试了here找到的代码,但它引发了java.io.NotSerializableException

现在我需要数据保持不变。有没有办法保存它而不修改它?

该帖子中还有其他关于如何序列化数据的答案,但我担心这会使我对静态对象的结果产生偏差。

3 个答案:

答案 0 :(得分:1)

java.io.NotSerializableException - 如果您的类没有实现Serializable,则会发生这种情况。 Serializable类的对象将作为包含该对象的所有信息的字节序列写入文件。

如果您不想使用它,那么还有其他方法可以序列化像JSON或MessagePack这样的对象......只需进行研究并找到最符合您需求的方法。

答案 1 :(得分:0)

您可以使用像Jackson这样的JSON序列化程序来执行此操作。理想情况下,对象将为您提及的数据提供相关的getter,您需要保持完整。即使数据是私有的,您也可以告诉Jackson使用反射来序列化它。

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序列化程序可以帮助您解决这个问题。

答案 2 :(得分:0)

我认为您的问题与SOAP或数据传输无关,而只与Java序列化有关。你的班级可以序列化吗?你能写一个简单的main方法来编写和读取你的实例到文件或ByteArrayOutputStream吗?请参阅here

如果/当您的对象可序列化时,您需要将数据读取与反序列化部分分开。使用ByteArrayOutputStream收集数据(或非常大的数据的临时文件),并在数据传输完成时进行反序列化。

整个过程不会更快,这不会解决任何序列化/反序列化错误,它只允许分离这两个部分,允许您使用不同的线程或asynchio来更好地利用服务器资源。