如何将String对象重新转换为ArrayList <entity>?</entity>

时间:2012-06-13 12:45:25

标签: java hibernate list arraylist tostring

我有一个Arraylist

List<?> myList=new ArrayList();

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

现在myList有一个实体列表

现在我将该列表转换为字符串,因此它现在是一个字符串对象。

String temp=myList.toString();

我的问题是如何将该临时字符串再次转换为myList(实体列表)???

任何想法??

My Temp Value看起来像这样

temp =“[entityObject1,entityObject2 .......]”..

我无法提取每个对象并使用该实体类强制转换..有没有办法?

谢谢..

4 个答案:

答案 0 :(得分:2)

我做了一个示例程序来执行此转换。 你必须要小心的事情。  我们将要工作的名单应该有一个班级         over ridden toString方法。(你可以拥有自己的toString()格式         但需要相应地更改其余的实现。)

示例内容具有重叠的toString()方法的Object Class。

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;
    }

}

Main Application.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;
    }
}

答案 1 :(得分:0)

这取决于toString()实现如果你暴露了toString()中的每个字段,特别是格式解析它可以得到格式化的原始对象,但通常情况并非如此

例如:

您无法从string形成人员实例,因为ID未公开

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

另见

答案 2 :(得分:0)

当你做myList.toString();实际上你调用AbstractCollection.toString()方法,后者又调用List中每个对象的toString()方法。

除非Entity类的toString()方法以对您以后可以重构它们的方式序列化对象,否则您将无法执行任何操作。

如果它确实正确地序列化它们,则需要解析临时字符串,识别每个Entity对象的所有单个字符串并从那里重构它们。

只有当每个Entity对象的序列化字符串不包含方括号和逗号字符,或者它们正确地转义它们时,才能执行此操作。这是因为AbstractCollection.toString()方法在构建临时字符串时使用这些特殊字符。

如果满足上述所有条件,则可以使用正则表达式解析临时字符串并获取每个单独的序列化实体对象。然后由您来重建对象并将它们添加到新列表中。

对于Java中的正则表达式,请参阅http://docs.oracle.com/javase/6/docs/api/java/util/regex/package-summary.html

答案 3 :(得分:0)

这是一个想法:

使toString类的Entity方法生成与某种序列化程序(如JAXB或XStream)兼容的XML字符串。然后,当您获得Collection.toString()时,按实体拆分(也许String.split()可以提供帮助)。简而言之,您希望实体XML定义返回到一个String中,您可以将其传递给XML XML反序列化器,反过来,它可以将您的strin转换回该类型的Object。