0

この特定のプロジェクトでは、エンティティ レイヤー (POJO で作成) をファイルにシリアル化する必要があります。特定のオブジェクトを更新する必要があるため、シリアル化されたオブジェクトごとに 1 つのファイルを使用したいと考えています。

例: 顧客 --ArrayList-> 注文 --ArrayList-> 製品

顧客を編集し、java.io.Serializable インターフェイスを使用してシリアル化すると、すべてのフィールドとそのフィールド (間違っている場合は修正してください) がシリアル化されます。

ファイルごとに 1 つのオブジェクトのみが使用されるようにシリアル化を適用するにはどうすればよいですか? 各オブジェクトには、シリアライズ時にファイル名として使用される一意の UUID がすでに与えられています。

ファイルベースの ORM を行うフレームワークがあれば、それはさらに良いでしょう ;)

4

2 に答える 2

0

私はそのようなフレームワークに精通していません。次の再帰アルゴリズムを実行するために、 apache BeanUtils
などの他のフレームワークを使用することができます 。 B. 各プリミティブ フィールドについて、すべてのプリミティブをファイルに書き込みます (リフレクションを使用して、フィールドがプリミティブかどうかを判断できます)。 C. 非プリミティブ ファイルごとに、フィールドの値であるオブジェクトを含むファイル名を指す特別なセクションをファイルに書き込みます。 D. 非プリミティブ フィールドごとにアルゴリズムを再帰的に呼び出す。 コレクション ( HashMap、ArrayList など) に対しても同様のアプローチを行うことができます。









プリミティブ要素のシリアル化コードは、@Anshu が提供するコードにすることができます

于 2012-10-08T13:05:54.933 に答える
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 に答える