从服务器中提取数据(使用SOAP方法)很慢,我希望程序加载已存在的对象。我尝试了here找到的代码,但它引发了java.io.NotSerializableException
现在我需要数据保持不变。有没有办法保存它而不修改它?
该帖子中还有其他关于如何序列化数据的答案,但我担心这会使我对静态对象的结果产生偏差。
答案 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来更好地利用服务器资源。