1

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

现在我需要数据保持完整。有什么方法可以保存而不修改它?

在那篇文章中还有其他关于如何序列化数据的答案,但我担心这会扭曲我使用静态对象得到的结果。

4

3 回答 3

1

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

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

于 2017-05-13T13:18:05.667 回答
0

您可以使用像 Jackson 这样的 JSON 序列化程序来执行此操作。理想情况下,该对象将为您提到需要保持完整的数据具有相关的吸气剂。即使数据是私有的,您也可以告诉 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在事后实现它。使用像 Jackson 这样的 JSON 序列化程序可以帮助您解决这个问题。

于 2017-05-13T13:21:44.870 回答
0

我认为您的问题与 SOAP 或数据传输无关,而与 Java 序列化无关。你的类是可序列化的吗?你能写一个简单的 main 方法,将你的实例写入文件或 ByteArrayOutputStream 吗?见这里

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

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

于 2017-05-13T13:23:27.513 回答