【问题标题】:Java: Save Object for Later UseJava:保存对象以备后用
【发布时间】:2017-05-13 13:00:29
【问题描述】:

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

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

该帖子中还有其他关于如何序列化数据的答案,但我担心这会扭曲我使用静态对象获得的结果。

【问题讨论】:

    标签: java soap cisco-axl


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-03-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-11
          • 2010-11-30
          • 1970-01-01
          相关资源
          最近更新 更多