0

对于这个特定的项目,我需要将我的实体层(由 POJO 制成)序列化为文件。由于我需要更新特定对象,我想每个序列化对象使用一个文件。

示例:客户 --ArrayList-> 订单 --ArrayList-> 产品

当我编辑一个客户,然后使用 java.io.Serializable 接口对其进行序列化时,所有字段及其字段(如有错误请纠正我)进行序列化。

我将如何以每个文件只使用一个对象的方式应用序列化?我已经给每个对象一个唯一的 UUID,它在序列化时用作文件名。

如果有任何框架可以执行基于文件的 ORM,那就更好了;)

4

2 回答 2

0

您始终可以使用readObject和读取和写入可序列化对象writeObject。以下是示例代码:

import java.io.*;
import java.util.*;
import java.util.logging.*;

public class ExerciseSerializable {

  public static void main(String... aArguments) {
    //create a Serializable List
    List<String> quarks = Arrays.asList(
      "up", "down", "strange", "charm", "top", "bottom"
    );

    //serialize the List
    //note the use of abstract base class references

    try{
      //use buffering
      OutputStream file = new FileOutputStream( "quarks.ser" );
      OutputStream buffer = new BufferedOutputStream( file );
      ObjectOutput output = new ObjectOutputStream( buffer );
      try{
        output.writeObject(quarks);
      }
      finally{
        output.close();
      }
    }  
    catch(IOException ex){
      fLogger.log(Level.SEVERE, "Cannot perform output.", ex);
    }

    //deserialize the quarks.ser file
    //note the use of abstract base class references

    try{
      //use buffering
      InputStream file = new FileInputStream( "quarks.ser" );
      InputStream buffer = new BufferedInputStream( file );
      ObjectInput input = new ObjectInputStream ( buffer );
      try{
        //deserialize the List
        List<String> recoveredQuarks = (List<String>)input.readObject();
        //display its data
        for(String quark: recoveredQuarks){
          System.out.println("Recovered Quark: " + quark);
        }
      }
      finally{
        input.close();
      }
    }
    catch(ClassNotFoundException ex){
      fLogger.log(Level.SEVERE, "Cannot perform input. Class not found.", ex);
    }
    catch(IOException ex){
      fLogger.log(Level.SEVERE, "Cannot perform input.", ex);
    }
  }

  // PRIVATE //

  //Use Java's logging facilities to record exceptions.
  //The behavior of the logger can be configured through a
  //text file, or programmatically through the logging API.
  private static final Logger fLogger =
    Logger.getLogger(ExerciseSerializable.class.getPackage().getName())
  ;
} 
于 2012-10-08T12:47:12.277 回答
0

我不熟悉这样的框架。
您可以做的是使用其他框架,例如 apache BeanUtils来执行以下递归算法:
A. 对于每个对象获取其属性(假设对象是 Java bean)。
B. 对于每个原始字段,将所有原始字段写入文件(您可以使用反射来确定字段是否为原始字段)。
C. 对于每个非原始文件,在文件中写入一个特殊部分,指向将包含作为字段值的对象的文件名。
D. 递归调用每个非原始字段的算法。


可以对集合执行类似的方法 -
HashMap、ArrayList 等。

原始元素的序列化代码可以是@Anshu提供的代码

于 2012-10-08T13:05:54.933 回答