【发布时间】:2017-05-13 13:00:29
【问题描述】:
从服务器提取数据(使用 SOAP 方法)很慢,我希望程序加载已经存在的对象。我尝试了找到here 的代码,但它引发了java.io.NotSerializableException
现在我需要数据保持完整。有什么方法可以保存而不修改它?
该帖子中还有其他关于如何序列化数据的答案,但我担心这会扭曲我使用静态对象获得的结果。
【问题讨论】:
从服务器提取数据(使用 SOAP 方法)很慢,我希望程序加载已经存在的对象。我尝试了找到here 的代码,但它引发了java.io.NotSerializableException
现在我需要数据保持完整。有什么方法可以保存而不修改它?
该帖子中还有其他关于如何序列化数据的答案,但我担心这会扭曲我使用静态对象获得的结果。
【问题讨论】:
java.io.NotSerializableException - 如果你的类没有实现 Serializable,就会发生这种情况。 Serializable 类的对象将作为包含该对象所有信息的字节序列写入文件。
如果您不想使用它,那么还有其他方法可以序列化对象,例如 JSON 或 MessagePack ...只需进行研究并找到最适合您需求的方法。
【讨论】:
您可以使用像 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 序列化程序可以帮助您解决这个问题。
【讨论】:
我认为您的问题与 SOAP 或数据传输无关,而只是 Java 序列化。你的类是可序列化的吗?你能写一个简单的 main 方法,将你的实例写入文件或 ByteArrayOutputStream 吗?见here。
如果/当您的对象可序列化时,您需要将读取的数据与反序列化部分分开。使用 ByteArrayOutputStream 收集数据(或用于非常大的数据的临时文件)并在数据传输完成时进行反序列化。
整个过程不会更快,这不会解决任何序列化/反序列化错误,它只是允许将两个部分分开,让您可以使用不同的线程或异步来更好地利用服务器资源。
【讨论】: