4

配列リストがあります

List<?> myList=new ArrayList();

myList = fetchQuery(); //fetches the list of Entities

myListにエンティティのリストが追加されました

今、私はそのリストを文字列に変換するので、それは文字列オブジェクトになります。

String temp=myList.toString();

私の質問は、その一時文字列を再びそのmyList(エンティティのリスト)に変換する方法です???

何か案は??

私の一時的な値は次のようになります

temp = "[entityObject1、entityObject2.......]"。。

各オブジェクトを抽出して、そのエンティティクラスでキャストできませんでした。方法はありますか?

ありがとう..

4

4 に答える 4

2

この変換を行うためのサンプルプログラムを実行しました。注意しなければならないこと。1.作業するリストのtoStringメソッドをオーバーライドする必要があります(独自のtoString()形式を使用できますが、それに応じて残りの実装を変更する必要があります)。

toString()メソッドをオーバーライドしたサンプルコンテンツオブジェクトクラス。

class Sample {

    private String name;
    private String sex;

    @Override
    public String toString() {
        return "name=" + name + "&" + "sex=" + sex;
    }
    /**
     * @param name
     *            the name to set
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * @param sex
     *            the sex to set
     */
    public void setSex(String sex) {
        this.sex = sex;
    }

}

メインアプリケーション.java

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

public class MainApplication {

    public static void main(String[] args) {
        List<Sample> e = new ArrayList<Sample>();
        Sample a1 = new Sample();
        a1.setName("foo1");
        a1.setSex("Male");

        Sample a2 = new Sample();
        a2.setName("foo2");
        a2.setSex("Male");
        e.add(a1);
        e.add(a2);

        String tmpString=e.toString();
        List<Sample> sampleList = (List<Sample>) chengeToObjectList(tmpString, Sample.class);
    }

    /**
     * Method to change String to List<Obj>.
     * @param listString
     * @param contentClass
     * @return List of Objects
     */
    public static Collection chengeToObjectList(String listString, Class contentClass) {

        Collection returnList = new ArrayList();

        // Code to remove [ and ] coming from the toString method
        if (listString.charAt(0) == '[') {
            listString = listString.substring(1);
        }
        if (listString.charAt(listString.length() - 1) == ']') {
            listString = listString.substring(0, listString.length() - 1);
        }

        String[] stringArray = listString.trim().split(",");
        for (int i = 0; i < stringArray.length; i++) {
            String[] contentArray = stringArray[i].trim().split("&");
            Object ob = null;
            try {
                ob = contentClass.newInstance();
            } catch (InstantiationException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            } catch (IllegalAccessException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            for (int j = 0; j < contentArray.length; j++) {

                String[] keyValueArray = contentArray[j].trim().split("=");

                String fieldName = keyValueArray[0].trim();
                //Code to make the 1st char uppercase
                String s = String.valueOf(fieldName.toCharArray()[0]);
                s = s.toUpperCase();
                fieldName = s + fieldName.substring(1);

                String fieldValue = keyValueArray[1].trim();

                Class[] paramTypes = new Class[1];
                paramTypes[0] = String.class;
                String methodName = "set" + fieldName; 
                Method m = null;
                try {
                    m = contentClass.getMethod(methodName, paramTypes);
                } catch (NoSuchMethodException m) {
                    m.printStackTrace();
                }
                try {
                    String result = (String) m.invoke(ob, fieldValue);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e1) {
                    e1.printStackTrace();
                }
            }
            returnList.add(ob);
        }

        return returnList;
    }
}
于 2012-06-13T14:12:58.553 に答える
0

toString()toString()の各フィールドを特定の形式で公開して逆に解析したかどうかは実装によって異なりますが、元のオブジェクトをフォーマットして取得できますが、通常はそうではありません。

例えば:

stringIDが公開されていないため、からpersonインスタンスを作成することはできません

class Person{
  private long id;
  private String name;
  //stuffs
  @Override
  public String toString(){ return "Person  :" +name;}
}

関連項目

于 2012-06-13T12:47:22.993 に答える
0

myList.toString();を実行するとき 実際には、AbstractCollection.toString()メソッドを呼び出します。このメソッドは、リスト内の各オブジェクトのtoString()メソッドを呼び出します。

EntityクラスのtoString()メソッドが、後で再構築できるようにオブジェクトをシリアル化しない限り、何もできません。

それらが適切にシリアル化される場合は、一時文字列を解析し、各エンティティオブジェクトのすべての個別の文字列を識別して、そこから再構築する必要があります。

これは、各Entityオブジェクトのシリアル化された文字列に角かっことコンマ文字が含まれていない場合、またはそれらが適切にエスケープされている場合にのみ実行できます。これは、AbstractCollection.toString()メソッドが一時文字列を作成するときにこれらの特殊文字を使用するためです。

上記のすべての条件が満たされている場合は、正規表現を使用して一時文字列を解析し、シリアル化された個々のエンティティオブジェクトをそれぞれ取得できます。次に、オブジェクトを再構築して新しいリストに追加するのはあなた次第です。

Javaの正規表現については、http://docs.oracle.com/javase/6/docs/api/java/util/regex/package-summary.htmlを参照してください

于 2012-06-13T13:02:42.013 に答える
0

ここにアイデアがあります:

クラスのtoStringメソッドに、EntityJAXBやXStreamなどのある種のシリアライザーと互換性のあるXML文字列を生成させます。次に、を取得したら、Collection.toString()エンティティごとに分割します(おそらくString.split()役立つ可能性があります)。簡単に言うと、エンティティのXML定義を文字列に戻し、XMLデシリアライザーに渡すことができます。これにより、ストリンをそのタイプのオブジェクトに戻すことができます。

于 2012-06-13T13:14:15.760 に答える